তম ফিবোনাচি সংখ্যা গণনা করার জন্য দক্ষ অ্যালগরিদম


11

ম ফিবানচি সংখ্যা রৈখিক সময় নিম্নলিখিত পুনরাবৃত্তি ব্যবহার করে নির্ণিত করা যেতে পারে:এন

def fib(n):
    i, j = 1, 1
    for k in {1...n-1}:
        i, j = j, i+j
    return i

ম ফিবানচি সংখ্যা হিসেবে নির্ণিত করা যেতে পারে । যাইহোক, এটি এমনকি অপেক্ষাকৃত ছোট জন্য গোলাকার সমস্যাগুলির সাথে সমস্যা রয়েছে । এটি প্রায় কাছাকাছি উপায় আছে কিন্তু আমি বরং এটি না করব।এন[φএন/5]এন

সেখানে একটি দক্ষ (মান মধ্যে লগারিদমিক হয় অ্যালগরিদম বা ভাল) গনা ম ফিবানচি সংখ্যা ফ্লোটিং পয়েন্ট গাণিতিক উপর নির্ভর করে না? ধরে নিন যে পূর্ণসংখ্যার ক্রিয়াকলাপগুলি ( , , , ) ধ্রুবক সময়ে সম্পাদন করা যায়।এনএন+ +-×/


5
একটি পরামর্শ হিসাবে, ফিবোনাচি সংখ্যায় উইকিপিডিয়া নিবন্ধে প্রচুর পদ্ধতি রয়েছে।
ছদ্মনাম

cf. stackoverflow.com/questions/14661633/… এবং এতে এবং তার চারপাশে লিঙ্কগুলি রয়েছে।
নেস

উত্তর:


14

আপনি ম্যাট্রিক্স পাওয়ারিং এবং পরিচয় ব্যবহার করতে পারেন আপনার গণনার মডেলটিতে এটি একটি অ্যালগরিদম হয় যদি আপনি শক্তি প্রয়োগের জন্য বারবার স্কোয়ারিং ব্যবহার করেন।(লগএন)

[1110]এন=[এফএন+ +1এফএনএফএনএফএন-1]
হে(লগএন)

1
এটি একটি ক্লাসিক।
ডিফিউয়ার

8
আপনি এই পরিচয়টি এবং । এফ 2 এন = এফ 2 এন + 2 এফ এন - 1 এফ এনএফ2এন-1=এফএন2+ +এফএন-12এফ2এন=এফএন2+ +2এফএন-1এফএন
augurar

4

আপনি এই গাণিতিক নিবন্ধটি পড়তে পারেন: বৃহত ফিবোনাচি সংখ্যা (ডাইসুক তাকাহাশি) গণনা করার জন্য একটি দ্রুত অ্যালগরিদম : পিডিএফ

আরও সহজ, আমি সি ++ (জিএমপি ছাড়া এবং এর সাথে) এবং পাইথনে বেশ কয়েকটি ফিবোনাকির আলগোরিদিমগুলি প্রয়োগ করেছি। বিটবকেটে সম্পূর্ণ উত্স । মূল পৃষ্ঠা থেকে আপনি লিঙ্কগুলি অনুসরণ করতে পারেন:

  • সি ++ এইচটিএমএল অনলাইন ডকুমেন্টেশন।
  • সামান্য গাণিতিক দলিল: ফিবোনাচি সংখ্যা - ভাল অ্যালগরিদম বাস্তবায়নের জন্য বেশ কয়েকটি সম্পর্ক

সবচেয়ে দরকারী সূত্রগুলি হ'ল:

  • এফ2এন=এফএন+ +12-এফএন-12=2এফএনএফএন-1+ +এফএন2
  • এফ2এন+ +1=এফএন+ +12+ +এফএন2

অ্যালগরিদম সম্পর্কে সাবধানতা অবলম্বন করুন। আপনি একই মানটি কয়েকবার গণনা করবেন না। একটি সাধারণ পুনরাবৃত্ত আলগোরিদিম (পাইথনে):

def fibonacci_pair(n):
    """Return (F_{n-1}, F_n)"""
    if n != 0:
        f_k_1, f_k = fibonacci_pair(n//2)  # F_{k-1},F_k with k = n/2

        return ((f_k**2 + f_k_1**2,
                 ((f_k*f_k_1)*2) + f_k**2) if n & 1 == 0  # even
                else (((f_k*f_k_1)*2) + f_k**2,
                      (f_k + f_k_1)**2 + f_k**2))
    else:
        return (1, 0)

এর জটিলতা লোগারিদমিক (যদি প্রাথমিক ক্রিয়াকলাপগুলি ধ্রুব সময়ে হয়): ।হে(লগএন)


2
কম্পিউটার বিজ্ঞানে স্বাগতম । আপনি আপনার উত্তর আরও তথ্য যোগ করতে পারেন দয়া করে? এই মুহুর্তে, এটি দুটি লিঙ্কের চেয়ে বেশি কিছুই নয়, সুতরাং যদি এই লিঙ্কগুলি মারা যায় বা তারা যে সার্ভারে রয়েছে তারা অনুপলব্ধ থাকে তবে আপনার উত্তর অর্থহীন হয়ে যাবে। আরও তথ্যের লিঙ্কগুলি ঠিক আছে তবে এখানে লিঙ্কগুলি কেবল তথ্য। এছাড়াও, দয়া করে নোট করুন যে প্রশ্নটি খুব অবশ্যই অ্যালগোরিদম সম্পর্কে, সি ++ বাস্তবায়ন সম্পর্কে নয়। প্রয়োগগুলি ভাষা-নির্দিষ্ট বিশদের পিছনে অ্যালগরিদমগুলিকে অস্পষ্ট করে।
ডেভিড রিচার্বি

ডেভিড, প্রথম লিঙ্কটি একটি গাণিতিক নিবন্ধের লিঙ্ক। শিরোনাম একটি দ্রুত অ্যালগরিদম [...] প্রশ্নের উত্তর দেয় "একটি দক্ষ (লোগারিদমিক মান বা আরও ভাল) এর অ্যালগরিদম আছে কি [...]?" দ্বিতীয় লিঙ্কটি সি ++ এবং পাইথনে আমার বিভিন্ন বাস্তবায়নের একটি লিঙ্ক এবং বেশ কয়েকটি সূত্রযুক্ত একটি সামান্য গাণিতিক ডকুমেন্ট।
অলিভিয়ার পিরসন 21

2
না, নিবন্ধটির শিরোনাম , যা আপনার উত্তরটিতে যা রয়েছে, কিছুই উত্তর দেয় না। আপনার উত্তরটির প্রায় নিচের কোনও নিবন্ধের পাঠ্যটি মনে হচ্ছে এটি সম্ভবত প্রশ্নের উত্তর দেয়। কিন্তু স্ট্যাক এক্সচেঞ্জ একটি লিঙ্ক ফার্ম নয়, একটি প্রশ্নোত্তর সাইট। (এবং, না, আমি প্রস্তাবটি দিচ্ছি না যে আপনি আপনার উত্তরে নিবন্ধটি কপি-পেস্ট করুন But তবে একটি সংক্ষিপ্তসার প্রয়োজন))
ডেভিড রিচার্বি

আপনি যদি একটি সংক্ষিপ্ত বিবরণ চান, এটি লিখুন!
অলিভিয়ার পীরসন

0

ধ্রুবক সহগের সাথে রৈখিক পুনরাবৃত্তিগুলি গণনা করার জন্য প্রাথমিক তত্ত্ব এবং কোডটি http://www.jjj.de/ থেকে উপলব্ধ ।হে(লগ2এন)

ফ্রি বই ম্যাটারস কম্পিউটেশনাল এবং পারি / জিপি কোড পরীক্ষা করুন।


5
শুধু লিঙ্কগুলি পোস্ট করার পরিবর্তে ধারণাগুলির সংক্ষিপ্তসার আরও ভাল।
augurar
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.