فيبوناتشي حتى الأرقام

مستوحاة من تعليق تحت منشور فيبوناتشي للمقابلة . ذكر المستخدم pavellyzhin مهمة المقابلة التالية ( تعليق ):
منذ أكثر من عام ، استجاب "مبرمج php" للوظيفة الشاغرة ، وأرسلوا المعارف التقليدية وكانت هناك مهمة من فيبوناتشي: حدد جميع أرقام فيبوناتشي حتى في النطاق من 1 إلى 10000 . قررت استخدام حلقة (من أجل). هناك ، كان من الضروري أيضًا إجراء استعلام SQL لتحديد أقرب أعياد ميلاد المستخدمين ، لتعويض شيء ما ، لا أتذكر وأكتب نوعًا من الوظيفة. فعلت كل شيء ، أرسلها. أرسلوا إجابة: "وفقًا لنتائج مهمة الاختبار ، فأنت غير مقبول". بالضبط ما لم يعجبهم لم يكتب. الآن أنا جالس وأفكر ، ربما بعد كل شيء بسبب Fibonacci طرت ... :)
سأوضح في هذا المنشور كيف كان من الممكن حل هذه المشكلة بفعالية ، وربما حتى بكفاءة ، لكن هذا ليس دقيقًا. في الوقت نفسه ، سأبين بضعة آلاف من الحقائق المثبتة حول أرقام فيبوناتشي.


وضع نظرية في



أفضل طريقة للبدء هي النظر إلى عيون أرقام N Fibonacci الأولى ومحاولة إيجاد نمط في ترتيب الأرقام الزوجية.

1.1 دولار ، {\ bf 2} ، 3.5 ، {\ bf 8} ، 13.21 ، {\ bf 34} ، 55.89 ، {\ bf 144} ، \ ldots $


يتم تمييز الأرقام الزوجية بالتسلسل ، كما يمكنك أن ترى أن كل رقم فيبوناتشي ثالث متساوٍ ، وربما تكون جميع الأرقام الزوجية في مواضع مضاعفات 3. هذا سيكون تخميننا ، والآن نحن بحاجة إلى تأكيده والعمل على خوارزمية حسابية.

أفضل دليل بسيط ، لذا بفضل AllexIn على الفكرة البسيطة التي افتقدتها في البداية. كل رقم لاحق من فيبوناتشي هو مجموع الرقمين السابقين ، إذا كان الرقمان السابقان غريبين ، فسيكون العدد التالي متساويًا ، إذا كان الرقمان السابقان غريبًا والآخر متساوي ، فإن الرقم التالي سيكون فرديًا. من حيث المبدأ ، هذه الفكرة وحدها كافية بالفعل "لتلمس حدسي" الحقيقة المثبتة. الدليل بالتحريض واضح ، لكنني لا أستطيع المقاومة ، حتى لا أحضره

نثبت أن "كل رقم فيبوناتشي ثالث متساو ، والرقمان السابقان لكل رقم من هذا القبيل غريب".
  • قاعدة الحث . أول رقمين فيبوناتشي 1.1 دولار - الغريب ، العدد الثالث 2 دولار - حتى
  • الفرضية . لنفترض أن عدد فيبوناتشي يصل إلى 3 مضاعفات ، صحيح أن كل الثلث متساوي ، والثاني السابقان غريبان.
  • خطوة التعريفي . الرقم الذي يلي الأخير حتى من الفرضية غريب ، لأن يتم الحصول عليها من مجموع الغريب مع الزوج ، وبعد هذا العدد بالفعل هو أيضا غريب ، لأنه يتم الحصول عليها من مجموع حتى مع الغريب ، والقادم بعد ذلك ، لأنه الاثنان السابقان اللذان تلقيا للتو من أجله غريبان ، فعدد البناء لهما مضاعف 3 ، وهو متساو ، والآخران السابقان غريبان.


هذه هي الطريقة التي يمكننا بها إثبات تخميننا دون حتى اللجوء إلى الحسابات الرياضية. يمكنك إضفاء الطابع الرسمي على هذه الفكرة ، في الوقت نفسه الحصول على صيغة لحساب كل رقم فيبوناتشي ثالث Fn+3 من Fn و Fn+1 . باستخدام العلاقة العودية Fn+2=Fn+1+Fn حصلنا على:

Fn+3=Fn+2+Fn+1=2Fn+1+Fn


إذا كان الأمر كذلك Fn - حتى ذلك الحين Fn+3 أيضا حتى بحكم هذه الصيغة. بالنظر إلى ذلك F3=2دولادولا ، إذن كل رقم فيبوناتشي ثالث هو حقًا ، وهو ما يؤكد جزءًا من تخميننا. تحتاج هنا إلى التأكد من أننا لا نفتقد الأرقام الزوجية الأخرى ، أي أنهم جميعا لديهم مضاعفات 3. بفضل janatem لفكرته البسيطة ، لأنه من الصيغة أعلاه ل Fn+3 كما أنه يتبع ذلك إذا Fn - غريب إذن Fn+3 غريب أيضًا ، لذلك نحصل على هذه الأرقام بالأرقام 3k2،3k1،k in mathbbN،، - غريب (عن طريق الاستقراء ، تبدأ بـ F1=F2=1دولادولا - غريب) ، و 3 آلاف دولار ، k \ in \ mathbb {N} $ - حتى ، الذي يغطي جميع أرقام فيبوناتشي ، مما يعني أننا نغطي حقا جميع الأرقام الزوجية.

هناك طريقة أخرى ، حيث سيكون من الممكن إظهار أنه لا توجد أرقام زوجية أخرى. لنفترض أن هناك عددا Fm - حتى و 0 not equivm mod3 ثم م=3آلاف1دولامآلافدولا أو m=3k+1 حيث كك - نوع من الطبيعي.

دعنا ننتقل إلى تمثيل مصفوفة أرقام فيبوناتشي من المشاركة الأصلية

\ تبدأ {pmatrix} 0 & 1 \\ 1 & 1 \ end {pmatrix} ^ n = \ start {pmatrix} F_ {n-1} & F_n \\ F_n & F_ {n + 1} \ end {pmatrix}

\ تبدأ {pmatrix} 0 & 1 \\ 1 & 1 \ end {pmatrix} ^ n = \ start {pmatrix} F_ {n-1} & F_n \\ F_n & F_ {n + 1} \ end {pmatrix}


حساب المحدد لكلا الجزأين ، نحصل عليه

(1)n=Fn+1Fn1F2n


ويترتب على ذلك قسمة الأرقام Fn+1،Fn، و Fn1،Fn، فواصل المباراة (1)n ، أي أرقام فيبوناتشي المجاورة بسيطة بشكل متبادل. وهذا يعني أيضا أن البساطة والأرقام المتبادلة F3k،F3k1، و F3k،F3k+1 ، أي F3k و Fm . ولكن عن طريق الافتراض Fm - حتى و F3k - حتى كما ثبت سابقا. حتى الأرقام الأخرى من F3k حيث k in mathbbN في تسلسل فيبوناتشي غير موجود. وأقمنا أيضًا حقيقة مثيرة للاهتمام وهي أن أرقام فيبوناتشي المجاورة بسيطة ومتبادلة.

أخيرًا ، نعرض طريقة واحدة على الأقل لإثبات تخميننا: استخدم نظرية Luke.

نظرية لوقا . عدد صحيح يقسم Fm و Fn ، إذا وفقط إذا كان المقسوم عليه Fd حيث d= gcd(م،ن) على وجه الخصوص

 gcd(Fm،Fn)=F gcd(m،n)


هنا  gcd هو أكبر عامل مشترك. إذا وضعت م=3دولارا ثم  gcd(2،Fn)=F gcd(3،n) . إذا Fn - حتى ، إذا كان الجانب الأيسر هو 2 ، بحيث يساوي الجانب الأيمن أيضًا 2 ، فمن الضروري ذلك ن مقسوما على 3 وفي الوقت نفسه العكس هو الصحيح. وبالتالي ، نحصل على ما نريد إثباته بالضبط.

لذلك ، كل رقم فيبوناتشي ثالث متساوٍ ، وكل واحد لديه مضاعفات ثلاثة. لقد أثبتنا ذلك بعناية ولا يجرؤ أحد على الشك في الأمر الآن.

خوارزمية


والآن يبقى التوصل إلى خوارزمية. يمكنك بالطبع القيام بما فعله pavellyzhin في الأصل ، ولكن بدلاً من التحقق 0 equivFn mod2 يمكننا التحقق 0 equivn mod3 ، هذا تطور! صحيح ، هذا لا يؤثر على عدد التكرارات للخوارزمية ، لأننا قمنا بتغيير مرشح التسلسل. من الأفضل إنشاء مجموعة من أرقام فيبوناتشي على الفور مع الخاصية التي نحتاجها (التكافؤ) ، لذلك هناك طريقة أخرى واضحة تتمثل في استخدام صيغة Binet

F_n = \ left \ lfloor \ frac {\ varphi ^ n} {\ sqrt {5}} \ right \ rceil ، \ qquad n \ in \ {3،6 ، \ ldots ، 3k \ ldots \}


هناك صعوبات في كفاءة الحسابات ، المزيد حول هذا الموضوع في المشاركة الأصلية. لذلك ، أقترح الطريقة الأفضل - في رأيي - الحساب التكراري Fn+3 ، يمكن القيام بذلك ، كما أوضحنا سابقًا ، بواسطة الصيغة Fn+3=2Fn+1+Fn . لإنشاء انتقال تكراري في الخوارزمية ، نحتاج إلى حساب Fn+4 كل شيء بسيط

Fn+4=Fn+3+Fn+2=2Fn+1+Fn+Fn+1+Fn=3Fn+1+2Fn


بالمناسبة ، بشكل عام ، من السهل إثبات ذلك

Fn+m=FmFn+1+Fm1Fn


ثم يتم كتابة الخوارزمية رسميًا على النحو التالي (رقم فيبوناتشي الحالي حتى Fn تليها رقم فيبوناتشي Fn+1 . M هو الحد الأعلى للأرقام الواردة في حالة المشكلة):

  1. Fn leftarrowF3=2، quadFn+1 leftarrowF4=3
  2. إذا Fn>M ، ثم الانتهاء ، وإلا إضافة إلى النتيجة Fn
  3. (Fn،Fn+1) leftarrow(2Fn+1+Fn،3Fn+1+2Fn) انتقل إلى الخطوة 2.

الخوارزمية تافهة للغاية - فنحن ببساطة نقفز على كل رقم فيبوناتشي ثالث وطبعه (إذا لم يكن أكثر M ). لا يزال تعقيد الخوارزمية خطيًا ، لكن عدد مرات تكرار الخطوة 2 يساوي تمامًا عدد أرقام فيبوناتشي حتى في النطاق 1 ldotsM ، للمقارنة ، تتطلب خوارزمية بسيطة مع التكرار 3 مرات أكثر تكرار (لكل وجدت ، سيكون هناك 2 المهملة).

الخوارزمية موجودة على الورق ، ماذا كانت المقابلة ، PHP؟ حسنا ، كشف أخيرا يعني PHP

function evenfibs($ubound) { $result = []; [$evenf, $nextf] = [2, 3]; while($evenf <= $ubound) { array_push($result, $evenf); [$nextf, $evenf] = [ 3 * $nextf + 2 * $evenf, 2 * $nextf + $evenf]; } return $result; } 


ملاحظة : يمكن دائمًا تحسين هذه الطريقة ، على سبيل المثال ، تظهر قائمة تنقلات المستخدم. والفكرة هي أنه بالنسبة للحسابات ، لا نحتاج إلى أي شيء لا لزوم له ، باستثناء النتيجة التي تم الحصول عليها جزئيًا ، أي يمكننا حساب الأرقام الزوجية باستخدام أرقام فيبوناتشي السابقة فقط.

Fn+3=2Fn+1+Fn=3Fn+2Fn1=3Fn+Fn1+Fn1=3Fn+(Fn1+Fn2)+Fn3=4Fn+Fn3



 function evenfibs($ubound) { if($ubound < 2) return []; $evens = [2]; $next = 8; for($i = 1; $next <= $ubound; $i++) { $evens[$i] = $next; $next = $evens[$i]*4 + $evens[$i-1]; } return $evens; } 


تعميم


ذكرنا هنا نظرية لوقا ، التي تنص على ذلك  gcd(Fm،Fn)=F gcd(m،n) . نتيجة لذلك ، يمكننا الحصول على رقم فيبوناتشي Fn مضاعفات Fm ، إذا وفقط إذا كان عددها ن مضاعفة للرقم مدولا . أي يتم تقسيم كل رقم رابع فيبوناتشي على 3 ، كل 5 في 5 ، كل 6 في 8 ، إلخ.

ثم ، بطريقة بسيطة ، نحصل على خوارزمية لحساب فيبوناتشي لاحقة ، والتي تكون فيها العناصر مضاعفات لعدد معين Fm . باستخدام حقيقة ذلك

Fn+m=FmFn+1+Fm1FnFn+m+1=Fm+1Fn+1+FmFn


الخوارزمية السابقة يتحول إلى

  1. Fn leftarrowFm، quadFn+1 leftarrowFm+1
  2. إذا Fn>M ، ثم الانتهاء ، وإلا إضافة إلى النتيجة Fn
  3. (Fn،Fn+1) leftarrow(FmFn+1+Fm1Fn،Fm+1Fn+1+FmFn) انتقل إلى الخطوة 2.

حيث Fm1،Fm،Fm+1 يمكن تعيين الثوابت.

ملخص الملاحظات . كما لاحظ جهل المستخدم بحق ، في الحالة المعممة ، يمكن أيضًا إنشاء خوارزمية تستخدم الأرقام فقط من نتيجة جزئية.

Fn+1=Fn+Fn1Fn+2=3FnFn2Fn+3=4Fn+Fn3Fn+4=7FnFn4Fn+5=11Fn+Fn5 cdotsFn+t=(Ft+2Ft1)Fn+(1)t1Fnt



دعونا نثبت ذلك من خلال طريقة الحث الرياضي ، لأن t = 1 و t = 2 ، يكون الوفاء واضحًا. لنفترض أنه يحمل ما يصل إلى بعض ، ثم

Fn+t+1=Fn+t+Fn+t1=(Ft+2Ft1)Fn+(1)t1Fnt+(Ft1+2Ft2)Fn+(1)t2Fnt+1=(Ft+Ft1+2(Ft1+Ft2))Fn+(1)t1(FntFnt+1)=(Ft+1+2Ft)Fn+(1)t1(FntFntFnt1)=(Ft+1+2Ft)Fn+(1)tFnt1



شيء مثل المجموع


المهمة بالطبع اصطناعية تمامًا ، وعدد التكرارات صغير جدًا (من أجل M=10000دولا يحتوي الجواب على 6 أرقام فقط ، أي كان من الممكن إتمام 6 تكرارات ، وستحتاج الخوارزمية الأصلية "المباشرة" إلى 18) ، ولكن بهذه الطريقة يمكن للمستخدم الذي اكتشف شيئًا جديدًا هنا أن يُظهر الآن معرفة رياضية أعمق قليلاً بأرقام فيبوناتشي في المقابلة.

تحرير: بفضل مستخدمي janatem و AllexIn على البراهين البسيطة ، قمت بإدراجهما في "Theoremizing" ، وكذلك البحث عن الخوارزمية باستخدام فقط الأرقام الزوجية التي تم الحصول عليها بالفعل في الحسابات وإلى جهل المستخدم لتعميمها.

Source: https://habr.com/ru/post/ar450594/


All Articles