Problem Summary

The Fibonacci generating function is

$$A_F(x)=\sum_{k=1}^{\infty}F_kx^k=\frac{x}{1-x-x^2}.$$

A golden nugget is a positive integer value taken by this series for some rational \(x\). Problem 137 asks for the 15th such integer. The key fact used by the implementations is that the nuggets are exactly

$$N_k=F_{2k}F_{2k+1}\qquad (k\ge 1),$$

so the requested value is

$$N_{15}=F_{30}F_{31}=832040\cdot 1346269=1120149658760.$$

Mathematical Approach

The difficult part is not the final multiplication. The real work is to show that the integer values of the generating function occur in a very rigid Fibonacci pattern, so the 15th nugget can be read off from one indexed product instead of found by trial and error.

From the generating function to a quadratic constraint

Assume that the series takes an integer value \(n\), so \(A_F(x)=n\). Then

$$\frac{x}{1-x-x^2}=n,$$

which rearranges to

$$nx^2+(n+1)x-n=0.$$

The relevant root is the positive one, namely

$$x=\frac{-(n+1)+\sqrt{5n^2+2n+1}}{2n}.$$

Therefore \(x\) can only be rational if the discriminant

$$5n^2+2n+1$$

is a perfect square. That turns the original question into a Diophantine condition on \(n\).

A Fibonacci parametrization that produces nuggets

Now introduce the rational numbers

$$x_k=\frac{F_{2k}}{F_{2k+1}}.$$

The Fibonacci identities immediately explain why these values are special. Starting from Cassini's identity and rewriting it, one gets

$$F_{m+1}^2-F_mF_{m+1}-F_m^2=(-1)^m.$$

For an even index \(m=2k\), the right-hand side equals \(1\), so

$$F_{2k+1}^2-F_{2k}F_{2k+1}-F_{2k}^2=1.$$

Divide by \(F_{2k+1}^2\):

$$1-x_k-x_k^2=\frac{1}{F_{2k+1}^2}.$$

Substituting into the generating function gives

$$A_F(x_k)=\frac{F_{2k}/F_{2k+1}}{1/F_{2k+1}^2}=F_{2k}F_{2k+1}.$$

So every product \(F_{2k}F_{2k+1}\) really is a golden nugget, and it comes from the explicit rational input \(x_k=F_{2k}/F_{2k+1}\).

Why these are all the nuggets

If the discriminant is a square, write

$$m^2=5n^2+2n+1.$$

Multiplying by 5 and completing the square gives the Pell-type equation

$$5m^2-(5n+1)^2=4,$$

or equivalently

$$(5n+1)^2-5m^2=-4.$$

This is exactly the shape of the standard Lucas-Fibonacci identity

$$L_t^2-5F_t^2=4(-1)^t.$$

For odd \(t\), this becomes \(L_t^2-5F_t^2=-4\), so odd-indexed Lucas and Fibonacci numbers solve the same Diophantine equation. Among those odd indices, the requirement that \(5n+1\) be congruent to \(1\) modulo 5 selects \(t=4k+1\). Hence the admissible solutions satisfy

$$m=F_{4k+1},\qquad 5n+1=L_{4k+1}.$$

Using the standard identity

$$L_{4k+1}=5F_{2k}F_{2k+1}+1,$$

we obtain

$$n=F_{2k}F_{2k+1}.$$

So the family produced in the previous subsection is complete: the golden nuggets are precisely the products of consecutive Fibonacci numbers with indices \(2k\) and \(2k+1\).

Worked example

Take \(k=2\). Then

$$x=\frac{F_4}{F_5}=\frac{3}{5}.$$

From the identity above,

$$1-\frac{3}{5}-\left(\frac{3}{5}\right)^2=\frac{1}{25},$$

so

$$A_F\left(\frac{3}{5}\right)=\frac{3/5}{1/25}=15.$$

That is the second golden nugget. The next one comes from \(k=3\): \(x=8/13\) and

$$A_F\left(\frac{8}{13}\right)=8\cdot 13=104.$$

For the required term we take \(k=15\), which yields \(F_{30}F_{31}=1120149658760\).

How the Code Works

The C++, Python, and Java implementations do not search over candidate values of \(x\), and they do not solve the Pell-type equation numerically. They start from the proven closed form

$$N_k=F_{2k}F_{2k+1},$$

so for the 15th nugget they only need \(F_{30}\) and \(F_{31}\).

Iterating consecutive Fibonacci numbers

The implementation keeps two consecutive Fibonacci numbers and repeatedly advances them to the next pair. The loop invariant is straightforward: after finishing step \(i\), the stored pair is \(F_{i-1}\) and \(F_i\). Starting from \(F_0=0\) and \(F_1=1\), iterating up to \(i=31\) leaves exactly the pair \((F_{30},F_{31})\).

Forming the requested nugget

Once those two values are available, the answer is their product. One implementation also checks the known small case \(N_3=104\) before printing the requested term, which matches the worked example above. Python and Java use arbitrary-precision integers; the C++ version uses a wide fixed integer type, and the 15th nugget still fits comfortably inside it.

Complexity Analysis

For a general index \(k\), the algorithm computes Fibonacci numbers up to \(F_{2k+1}\), so the running time is \(O(k)\). The auxiliary space is \(O(1)\) beyond the storage needed for the integers themselves, because only a constant number of Fibonacci values are kept at any moment.

For this specific problem \(k=15\), the executed workload is tiny: 30 Fibonacci updates and one multiplication. The mathematics is the hard part; the actual computation is effectively constant-time.

Footnotes and References

  1. Problem page: https://projecteuler.net/problem=137
  2. Fibonacci numbers: Wikipedia - Fibonacci number
  3. Generating functions: Wikipedia - Generating function
  4. Cassini and Catalan identities: Wikipedia - Cassini and Catalan identities
  5. Lucas numbers: Wikipedia - Lucas number
  6. Pell's equation: Wikipedia - Pell's equation

Problemzusammenfassung

Die Fibonacci-Erzeugungsfunktion lautet

$$A_F(x)=\sum_{k=1}^{\infty}F_kx^k=\frac{x}{1-x-x^2}.$$

Ein Golden Nugget ist ein positiver ganzzahliger Wert dieser Reihe für ein rationales \(x\). In Problem 137 wird nach dem 15. solchen Wert gefragt. Die entscheidende Aussage, auf der die Implementierungen beruhen, ist

$$N_k=F_{2k}F_{2k+1}\qquad (k\ge 1),$$

also ist der gesuchte Wert

$$N_{15}=F_{30}F_{31}=832040\cdot 1346269=1120149658760.$$

Mathematischer Ansatz

Die eigentliche Schwierigkeit ist nicht die Endrechnung, sondern der Nachweis, dass die ganzzahligen Werte der Erzeugungsfunktion genau einem starren Fibonacci-Muster folgen. Sobald diese Struktur klar ist, wird aus einer scheinbaren Suche über rationale \(x\) nur noch ein einzelnes Fibonacci-Produkt.

Von der Erzeugungsfunktion zu einer quadratischen Bedingung

Nehmen wir an, die Reihe habe den ganzzahligen Wert \(n\), also \(A_F(x)=n\). Dann gilt

$$\frac{x}{1-x-x^2}=n,$$

und damit

$$nx^2+(n+1)x-n=0.$$

Die relevante Lösung ist die positive Wurzel

$$x=\frac{-(n+1)+\sqrt{5n^2+2n+1}}{2n}.$$

Folglich kann \(x\) nur dann rational sein, wenn die Diskriminante

$$5n^2+2n+1$$

ein perfektes Quadrat ist. Damit wird das ursprüngliche Problem zu einer diophantischen Bedingung an \(n\).

Eine Fibonacci-Parametrisierung, die Nuggets erzeugt

Betrachte nun die rationalen Zahlen

$$x_k=\frac{F_{2k}}{F_{2k+1}}.$$

Eine umgeschriebene Form der Cassini-Identität liefert

$$F_{m+1}^2-F_mF_{m+1}-F_m^2=(-1)^m.$$

Für einen geraden Index \(m=2k\) ist die rechte Seite gleich \(1\), also

$$F_{2k+1}^2-F_{2k}F_{2k+1}-F_{2k}^2=1.$$

Nach Division durch \(F_{2k+1}^2\) folgt

$$1-x_k-x_k^2=\frac{1}{F_{2k+1}^2}.$$

Setzt man das in die Erzeugungsfunktion ein, erhält man

$$A_F(x_k)=\frac{F_{2k}/F_{2k+1}}{1/F_{2k+1}^2}=F_{2k}F_{2k+1}.$$

Damit ist jedes Produkt \(F_{2k}F_{2k+1}\) tatsächlich ein Golden Nugget, und zwar mit dem expliziten rationalen Argument \(x_k=F_{2k}/F_{2k+1}\).

Warum dies alle Nuggets sind

Ist die Diskriminante ein Quadrat, so schreiben wir

$$m^2=5n^2+2n+1.$$

Nach Multiplikation mit 5 und Quadratergänzung entsteht die Pell-artige Gleichung

$$5m^2-(5n+1)^2=4,$$

beziehungsweise

$$(5n+1)^2-5m^2=-4.$$

Genau diese Form erscheint in der Standardidentität für Lucas- und Fibonacci-Zahlen,

$$L_t^2-5F_t^2=4(-1)^t.$$

Für ungerade \(t\) wird daraus \(L_t^2-5F_t^2=-4\), also liefern ungerade Indizes Lösungen derselben diophantischen Gleichung. Unter diesen ungeraden Indizes erzwingt die Bedingung \(5n+1\equiv 1\pmod 5\) die Wahl \(t=4k+1\). Somit gilt für die zulässigen Lösungen

$$m=F_{4k+1},\qquad 5n+1=L_{4k+1}.$$

Mit der Standardidentität

$$L_{4k+1}=5F_{2k}F_{2k+1}+1$$

folgt sofort

$$n=F_{2k}F_{2k+1}.$$

Die zuvor konstruierte Familie ist also vollständig: Die Golden Nuggets sind genau die Produkte aufeinanderfolgender Fibonacci-Zahlen mit Indizes \(2k\) und \(2k+1\).

Durchgerechnetes Beispiel

Nimm \(k=2\). Dann ist

$$x=\frac{F_4}{F_5}=\frac{3}{5}.$$

Aus der obigen Identität folgt

$$1-\frac{3}{5}-\left(\frac{3}{5}\right)^2=\frac{1}{25},$$

also

$$A_F\left(\frac{3}{5}\right)=\frac{3/5}{1/25}=15.$$

Das ist das zweite Golden Nugget. Der nächste Fall entsteht bei \(k=3\): \(x=8/13\) und

$$A_F\left(\frac{8}{13}\right)=8\cdot 13=104.$$

Für den gesuchten Term setzt man \(k=15\) und erhält \(F_{30}F_{31}=1120149658760\).

Wie der Code arbeitet

Die C++-, Python- und Java-Implementierungen suchen nicht über rationale Kandidaten \(x\), und sie lösen auch die Pell-artige Gleichung nicht numerisch. Stattdessen benutzen sie direkt die hergeleitete geschlossene Formel

$$N_k=F_{2k}F_{2k+1},$$

sodass für das 15. Nugget nur \(F_{30}\) und \(F_{31}\) benötigt werden.

Aufeinanderfolgende Fibonacci-Zahlen iterieren

Die Implementierung speichert zwei aufeinanderfolgende Fibonacci-Zahlen und schiebt dieses Paar in jeder Iteration um eine Position weiter. Die Schleifeninvariante lautet: Nach Abschluss von Schritt \(i\) sind die gespeicherten Werte \(F_{i-1}\) und \(F_i\). Beginnend mit \(F_0=0\) und \(F_1=1\) erhält man nach der Iteration bis \(i=31\) genau das Paar \((F_{30},F_{31})\).

Das gesuchte Nugget bilden

Sobald diese beiden Zahlen vorliegen, ist die Antwort einfach ihr Produkt. Eine Implementierung prüft zusätzlich den bekannten kleinen Fall \(N_3=104\), was mit dem durchgerechneten Beispiel übereinstimmt. Python und Java verwenden Ganzzahlen mit beliebiger Präzision; die C++-Version benutzt einen breiten festen Ganzzahltyp, und das 15. Nugget liegt noch bequem in dessen Wertebereich.

Komplexitätsanalyse

Für einen allgemeinen Index \(k\) werden Fibonacci-Zahlen bis \(F_{2k+1}\) erzeugt, daher beträgt die Laufzeit \(O(k)\). Der zusätzliche Speicherbedarf ist \(O(1)\), abgesehen vom Platz für die Zahlen selbst, weil nur konstant viele Fibonacci-Werte gleichzeitig gehalten werden.

Für dieses konkrete Problem mit \(k=15\) ist der tatsächliche Rechenaufwand winzig: 30 Fibonacci-Updates und eine Multiplikation. Schwer ist die Herleitung, nicht die Ausführung.

Fußnoten und Referenzen

  1. Problemseite: https://projecteuler.net/problem=137
  2. Fibonacci-Zahlen: Wikipedia - Fibonacci number
  3. Erzeugende Funktionen: Wikipedia - Generating function
  4. Cassini- und Catalan-Identitäten: Wikipedia - Cassini and Catalan identities
  5. Lucas-Zahlen: Wikipedia - Lucas number
  6. Pell-Gleichung: Wikipedia - Pell's equation

Problem Özeti

Fibonacci üreteç fonksiyonu

$$A_F(x)=\sum_{k=1}^{\infty}F_kx^k=\frac{x}{1-x-x^2}.$$

Altın nugget, bu serinin bir rasyonel \(x\) için aldığı pozitif tam sayı değerdir. Problem 137, bu değerlerin 15'incisini sorar. Uygulamaların dayandığı temel sonuç şudur:

$$N_k=F_{2k}F_{2k+1}\qquad (k\ge 1),$$

dolayısıyla istenen değer

$$N_{15}=F_{30}F_{31}=832040\cdot 1346269=1120149658760.$$

Matematiksel Yaklaşım

Asıl zorluk son çarpımda değil, üreteç fonksiyonunun tam sayı değerlerinin neden çok katı bir Fibonacci düzeni izlediğini göstermektedir. Bu yapı ortaya çıkarıldığında, rasyonel \(x\) değerleri arasında arama yapmak yerine tek bir indeksli Fibonacci çarpımına ulaşırız.

Üreteç fonksiyonundan ikinci derece bir koşula

Serinin tam sayı değeri \(n\) olsun; yani \(A_F(x)=n\). O zaman

$$\frac{x}{1-x-x^2}=n,$$

ve buradan

$$nx^2+(n+1)x-n=0$$

elde edilir. İlgili kök pozitif olanıdır:

$$x=\frac{-(n+1)+\sqrt{5n^2+2n+1}}{2n}.$$

Öyleyse \(x\)'in rasyonel olabilmesi için ayırt edicinin

$$5n^2+2n+1$$

tam kare olması gerekir. Böylece soru, \(n\) üzerinde bir Diofant koşuluna indirgenir.

Nugget üreten bir Fibonacci parametreleştirmesi

Şimdi şu rasyonel sayıları tanımlayalım:

$$x_k=\frac{F_{2k}}{F_{2k+1}}.$$

Cassini özdeşliğinin yeniden yazılmış biçimi

$$F_{m+1}^2-F_mF_{m+1}-F_m^2=(-1)^m$$

eşitliğini verir. \(m=2k\) çift olduğunda sağ taraf \(1\) olur; dolayısıyla

$$F_{2k+1}^2-F_{2k}F_{2k+1}-F_{2k}^2=1.$$

Bunu \(F_{2k+1}^2\)'ye bölersek

$$1-x_k-x_k^2=\frac{1}{F_{2k+1}^2}$$

elde edilir. Bunu üreteç fonksiyonuna yerleştirince

$$A_F(x_k)=\frac{F_{2k}/F_{2k+1}}{1/F_{2k+1}^2}=F_{2k}F_{2k+1}$$

olur. Yani her \(F_{2k}F_{2k+1}\) çarpımı gerçekten bir altın nugget'tır ve buna karşılık gelen rasyonel giriş de açıkça \(x_k=F_{2k}/F_{2k+1}\) olur.

Neden tüm nugget'lar bunlardır

Ayırt edici tam kare ise

$$m^2=5n^2+2n+1$$

yazabiliriz. 5 ile çarpıp kare tamamlarsak Pell-tipinde bir denklem elde ederiz:

$$5m^2-(5n+1)^2=4,$$

ya da eşdeğer olarak

$$(5n+1)^2-5m^2=-4.$$

Bu biçim, Lucas ve Fibonacci sayıları için bilinen

$$L_t^2-5F_t^2=4(-1)^t$$

özdeşliğiyle tam olarak aynıdır. \(t\) tek olduğunda \(L_t^2-5F_t^2=-4\) olur; yani tek indeksli Lucas ve Fibonacci sayıları aynı Diofant denkleminin çözümlerini verir. Bu tek indeksler arasında \(5n+1\equiv 1\pmod 5\) koşulu \(t=4k+1\) seçimini zorlar. Böylece geçerli çözümler

$$m=F_{4k+1},\qquad 5n+1=L_{4k+1}$$

şeklindedir. Ayrıca

$$L_{4k+1}=5F_{2k}F_{2k+1}+1$$

özdeşliğini kullanınca

$$n=F_{2k}F_{2k+1}$$

çıkar. Demek ki bir önceki alt bölümde kurulan aile tamdır: altın nugget'lar tam olarak indeksleri \(2k\) ve \(2k+1\) olan ardışık Fibonacci sayılarının çarpımlarıdır.

Çalışılmış örnek

\(k=2\) alalım. O zaman

$$x=\frac{F_4}{F_5}=\frac{3}{5}.$$

Yukarıdaki özdeşlikten

$$1-\frac{3}{5}-\left(\frac{3}{5}\right)^2=\frac{1}{25}$$

gelir; dolayısıyla

$$A_F\left(\frac{3}{5}\right)=\frac{3/5}{1/25}=15.$$

Bu, ikinci altın nugget'tır. Sonraki örnek \(k=3\) için gelir: \(x=8/13\) ve

$$A_F\left(\frac{8}{13}\right)=8\cdot 13=104.$$

İstenen terim için \(k=15\) alınır ve \(F_{30}F_{31}=1120149658760\) bulunur.

Kod Nasıl Çalışır

C++, Python ve Java uygulamaları aday \(x\) değerleri üzerinde arama yapmaz; Pell-tipindeki denklemi de sayısal olarak çözmez. Bunun yerine doğrudan kanıtlanmış kapalı formülü kullanır:

$$N_k=F_{2k}F_{2k+1},$$

bu yüzden 15. nugget için yalnızca \(F_{30}\) ve \(F_{31}\) gerekir.

Ardışık Fibonacci sayılarının ilerletilmesi

Uygulama her adımda iki ardışık Fibonacci sayısını tutar ve bunları bir sonraki ardışık çifte dönüştürür. Döngü değişmezi şudur: \(i\). adım tamamlandığında elde tutulan çift \(F_{i-1}\) ve \(F_i\) olur. Başlangıçta \(F_0=0\) ve \(F_1=1\) iken, \(i=31\)'e kadar ilerletildiğinde elde tam olarak \((F_{30},F_{31})\) çifti kalır.

İstenen nugget'ın oluşturulması

Bu iki değer elde edildikten sonra cevap onların çarpımıdır. Uygulamalardan biri, istenen terimi yazdırmadan önce bilinen küçük durum \(N_3=104\)'ü de kontrol eder; bu, yukarıdaki çalışılmış örnekle örtüşür. Python ve Java keyfi hassasiyetli tamsayılar kullanır; C++ sürümü ise geniş bir sabit tamsayı türü kullanır ve 15. nugget bu aralığa rahatça sığar.

Karmaşıklık Analizi

Genel bir \(k\) indeksi için algoritma \(F_{2k+1}\)'e kadar Fibonacci sayıları üretir; bu nedenle zaman karmaşıklığı \(O(k)\)'dir. Aynı anda yalnızca sabit sayıda Fibonacci değeri tutulduğu için, sayıların kendi depolama maliyeti dışında ek alan kullanımı \(O(1)\)'dir.

Bu özel problemde \(k=15\) olduğundan gerçek iş yükü çok küçüktür: 30 Fibonacci güncellemesi ve bir çarpma. Zor olan hesaplama değil, bu formüle ulaşan matematiksel türetmedir.

Dipnotlar ve Kaynaklar

  1. Problem sayfası: https://projecteuler.net/problem=137
  2. Fibonacci sayıları: Wikipedia - Fibonacci number
  3. Üreteç fonksiyonları: Wikipedia - Generating function
  4. Cassini ve Catalan özdeşlikleri: Wikipedia - Cassini and Catalan identities
  5. Lucas sayıları: Wikipedia - Lucas number
  6. Pell denklemi: Wikipedia - Pell's equation

Resumen del problema

La función generadora de Fibonacci es

$$A_F(x)=\sum_{k=1}^{\infty}F_kx^k=\frac{x}{1-x-x^2}.$$

Una pepita dorada es un valor entero positivo que toma esta serie para algún \(x\) racional. El problema 137 pide la decimoquinta de esas cantidades. El hecho central que usan las implementaciones es

$$N_k=F_{2k}F_{2k+1}\qquad (k\ge 1),$$

de modo que el valor buscado es

$$N_{15}=F_{30}F_{31}=832040\cdot 1346269=1120149658760.$$

Enfoque matemático

La dificultad real no está en la multiplicación final, sino en demostrar que los valores enteros de la función generadora siguen un patrón de Fibonacci muy rígido. Una vez identificada esa estructura, el problema deja de ser una búsqueda sobre muchos racionales \(x\) y pasa a ser un único producto indexado.

De la función generadora a una condición cuadrática

Supongamos que la serie vale \(n\), es decir, \(A_F(x)=n\). Entonces

$$\frac{x}{1-x-x^2}=n,$$

y esto se reordena como

$$nx^2+(n+1)x-n=0.$$

La raíz relevante es la positiva,

$$x=\frac{-(n+1)+\sqrt{5n^2+2n+1}}{2n}.$$

Por lo tanto, \(x\) solo puede ser racional si el discriminante

$$5n^2+2n+1$$

es un cuadrado perfecto. Así, la pregunta original se convierte en una condición diofántica sobre \(n\).

Una parametrización de Fibonacci que produce pepitas

Consideremos ahora los racionales

$$x_k=\frac{F_{2k}}{F_{2k+1}}.$$

Al reescribir la identidad de Cassini se obtiene

$$F_{m+1}^2-F_mF_{m+1}-F_m^2=(-1)^m.$$

Si \(m=2k\) es par, el lado derecho vale \(1\), así que

$$F_{2k+1}^2-F_{2k}F_{2k+1}-F_{2k}^2=1.$$

Al dividir entre \(F_{2k+1}^2\) queda

$$1-x_k-x_k^2=\frac{1}{F_{2k+1}^2}.$$

Al sustituir en la función generadora obtenemos

$$A_F(x_k)=\frac{F_{2k}/F_{2k+1}}{1/F_{2k+1}^2}=F_{2k}F_{2k+1}.$$

Por tanto, cada producto \(F_{2k}F_{2k+1}\) es realmente una pepita dorada, y además proviene del valor racional explícito \(x_k=F_{2k}/F_{2k+1}\).

Por qué estas son todas las pepitas

Si el discriminante es un cuadrado, escribimos

$$m^2=5n^2+2n+1.$$

Multiplicar por 5 y completar el cuadrado produce la ecuación de tipo Pell

$$5m^2-(5n+1)^2=4,$$

o, de forma equivalente,

$$(5n+1)^2-5m^2=-4.$$

Esta es exactamente la forma de la identidad clásica entre números de Lucas y Fibonacci,

$$L_t^2-5F_t^2=4(-1)^t.$$

Para \(t\) impar se obtiene \(L_t^2-5F_t^2=-4\), de modo que los índices impares ya generan soluciones de la misma ecuación diofántica. Entre esos índices impares, la condición \(5n+1\equiv 1\pmod 5\) selecciona \(t=4k+1\). Por ello, las soluciones admisibles cumplen

$$m=F_{4k+1},\qquad 5n+1=L_{4k+1}.$$

Usando la identidad

$$L_{4k+1}=5F_{2k}F_{2k+1}+1,$$

se deduce

$$n=F_{2k}F_{2k+1}.$$

En consecuencia, la familia construida en la subsección anterior es completa: las pepitas doradas son exactamente los productos de términos consecutivos de Fibonacci con índices \(2k\) y \(2k+1\).

Ejemplo trabajado

Tomemos \(k=2\). Entonces

$$x=\frac{F_4}{F_5}=\frac{3}{5}.$$

La identidad anterior da

$$1-\frac{3}{5}-\left(\frac{3}{5}\right)^2=\frac{1}{25},$$

así que

$$A_F\left(\frac{3}{5}\right)=\frac{3/5}{1/25}=15.$$

Esa es la segunda pepita dorada. La siguiente aparece con \(k=3\): \(x=8/13\) y

$$A_F\left(\frac{8}{13}\right)=8\cdot 13=104.$$

Para el término pedido se toma \(k=15\), lo que produce \(F_{30}F_{31}=1120149658760\).

Cómo funciona el código

Las implementaciones en C++, Python y Java no prueban muchos valores racionales de \(x\), ni resuelven numéricamente la ecuación de tipo Pell. Empiezan directamente desde la forma cerrada demostrada

$$N_k=F_{2k}F_{2k+1},$$

de modo que para la decimoquinta pepita solo hacen falta \(F_{30}\) y \(F_{31}\).

Iteración de Fibonacci consecutivos

La implementación mantiene dos números consecutivos de Fibonacci y en cada paso los sustituye por el siguiente par consecutivo. El invariante del bucle es simple: al terminar el paso \(i\), el par almacenado es \(F_{i-1}\) y \(F_i\). Partiendo de \(F_0=0\) y \(F_1=1\), al iterar hasta \(i=31\) se obtiene exactamente \((F_{30},F_{31})\).

Formación de la pepita solicitada

Una vez disponibles esos dos valores, la respuesta es su producto. Una implementación también verifica el caso pequeño conocido \(N_3=104\) antes de imprimir el término solicitado, en concordancia con el ejemplo desarrollado. Python y Java usan enteros de precisión arbitraria; la versión en C++ emplea un entero ancho de tamaño fijo, y la decimoquinta pepita sigue entrando sin problema.

Análisis de complejidad

Para un índice general \(k\), el algoritmo calcula números de Fibonacci hasta \(F_{2k+1}\), por lo que el tiempo de ejecución es \(O(k)\). El espacio auxiliar es \(O(1)\) aparte del almacenamiento de los propios enteros, ya que solo se conservan simultáneamente una cantidad constante de valores de Fibonacci.

En este problema concreto, con \(k=15\), el trabajo efectivo es mínimo: 30 actualizaciones de Fibonacci y una multiplicación final. Lo difícil es la derivación matemática; la ejecución es prácticamente constante.

Notas y referencias

  1. Página del problema: https://projecteuler.net/problem=137
  2. Números de Fibonacci: Wikipedia - Fibonacci number
  3. Funciones generadoras: Wikipedia - Generating function
  4. Identidades de Cassini y Catalan: Wikipedia - Cassini and Catalan identities
  5. Números de Lucas: Wikipedia - Lucas number
  6. Ecuación de Pell: Wikipedia - Pell's equation

问题概述

斐波那契生成函数为

$$A_F(x)=\sum_{k=1}^{\infty}F_kx^k=\frac{x}{1-x-x^2}.$$

所谓“金块”,是指该级数在某个有理数 \(x\) 处取得的正整数值。第 137 题要求求出第 15 个这样的整数。实现所依赖的核心结论是

$$N_k=F_{2k}F_{2k+1}\qquad (k\ge 1),$$

因此所求答案就是

$$N_{15}=F_{30}F_{31}=832040\cdot 1346269=1120149658760.$$

数学方法

真正困难的部分不是最后那次乘法,而是说明生成函数的整数取值为什么恰好落在一个非常刚性的斐波那契模式上。一旦这个结构被识别出来,问题就不再是对许多有理数 \(x\) 逐个试探,而是直接定位到一个带下标的斐波那契乘积。

从生成函数到二次约束

设级数的值为整数 \(n\),也就是 \(A_F(x)=n\)。那么有

$$\frac{x}{1-x-x^2}=n,$$

整理得到

$$nx^2+(n+1)x-n=0.$$

与题意相关的是它的正根:

$$x=\frac{-(n+1)+\sqrt{5n^2+2n+1}}{2n}.$$

因此,若 \(x\) 是有理数,则判别式

$$5n^2+2n+1$$

必须是完全平方数。原问题于是被转化为关于 \(n\) 的一个丢番图条件。

产生金块的斐波那契参数化

现在引入一组有理数

$$x_k=\frac{F_{2k}}{F_{2k+1}}.$$

把 Cassini 恒等式改写一下,可得

$$F_{m+1}^2-F_mF_{m+1}-F_m^2=(-1)^m.$$

当 \(m=2k\) 为偶数时,右边等于 \(1\),于是

$$F_{2k+1}^2-F_{2k}F_{2k+1}-F_{2k}^2=1.$$

再除以 \(F_{2k+1}^2\),得到

$$1-x_k-x_k^2=\frac{1}{F_{2k+1}^2}.$$

把它代回生成函数:

$$A_F(x_k)=\frac{F_{2k}/F_{2k+1}}{1/F_{2k+1}^2}=F_{2k}F_{2k+1}.$$

这说明每一个乘积 \(F_{2k}F_{2k+1}\) 都确实是金块,而且它对应的有理输入也完全显式:

$$x_k=\frac{F_{2k}}{F_{2k+1}}.$$

为什么这已经给出了全部金块

如果判别式是平方数,就写成

$$m^2=5n^2+2n+1.$$

乘以 5 并配方后得到 Pell 型方程

$$5m^2-(5n+1)^2=4,$$

等价地也可写成

$$(5n+1)^2-5m^2=-4.$$

这恰好与 Lucas 数和 Fibonacci 数之间的经典恒等式同型:

$$L_t^2-5F_t^2=4(-1)^t.$$

当 \(t\) 为奇数时,上式变成 \(L_t^2-5F_t^2=-4\),也就是说,奇数下标的 Lucas/Fibonacci 对自然给出了同一丢番图方程的解。再加上 \(5n+1\equiv 1\pmod 5\) 这个整除条件,就会筛选出 \(t=4k+1\)。于是可行解满足

$$m=F_{4k+1},\qquad 5n+1=L_{4k+1}.$$

再利用标准恒等式

$$L_{4k+1}=5F_{2k}F_{2k+1}+1,$$

便得到

$$n=F_{2k}F_{2k+1}.$$

因此,上一小节构造出的那一族并不是一部分解,而是全部解:所有金块恰好就是下标为 \(2k\) 与 \(2k+1\) 的相邻斐波那契数之积。

具体例子

取 \(k=2\)。这时

$$x=\frac{F_4}{F_5}=\frac{3}{5}.$$

由上面的恒等式可知

$$1-\frac{3}{5}-\left(\frac{3}{5}\right)^2=\frac{1}{25},$$

所以

$$A_F\left(\frac{3}{5}\right)=\frac{3/5}{1/25}=15.$$

这就是第二个金块。下一项对应 \(k=3\):此时 \(x=8/13\),并且

$$A_F\left(\frac{8}{13}\right)=8\cdot 13=104.$$

题目要求的是 \(k=15\) 的情况,因此答案为 \(F_{30}F_{31}=1120149658760\)。

代码如何工作

C++、Python 和 Java 的实现都不会枚举候选有理数 \(x\),也不会数值求解 Pell 型方程。它们直接从已经证明的闭式出发:

$$N_k=F_{2k}F_{2k+1},$$

所以第 15 个金块只需要 \(F_{30}\) 和 \(F_{31}\)。

迭代相邻的斐波那契数

实现中始终维护两个相邻的斐波那契数,并在每一步把它们推进到下一对。循环不变量非常清楚:完成第 \(i\) 步后,保存的两个数恰好是 \(F_{i-1}\) 和 \(F_i\)。从 \(F_0=0\)、\(F_1=1\) 出发,一直迭代到 \(i=31\),最后得到的正是 \((F_{30},F_{31})\)。

构造目标金块

一旦这两个数到手,答案就是它们的乘积。其中一个实现还会在输出目标项之前验证一个已知的小检查点 \(N_3=104\),这与上面的例子完全一致。Python 和 Java 使用任意精度整数;C++ 使用固定宽度但足够大的整数类型,而第 15 个金块远没有超出它的范围。

复杂度分析

对一般的下标 \(k\) 而言,算法需要把斐波那契数推进到 \(F_{2k+1}\),因此时间复杂度是 \(O(k)\)。除去整数本身所占的存储外,额外空间复杂度为 \(O(1)\),因为任意时刻只保留常数个斐波那契值。

对本题的固定目标 \(k=15\) 来说,实际执行量非常小:30 次斐波那契更新和 1 次乘法。真正需要思考的是推导过程,而不是运行成本。

注释与参考资料

  1. 题目页面: https://projecteuler.net/problem=137
  2. 斐波那契数: Wikipedia - Fibonacci number
  3. 生成函数: Wikipedia - Generating function
  4. Cassini 与 Catalan 恒等式: Wikipedia - Cassini and Catalan identities
  5. Lucas 数: Wikipedia - Lucas number
  6. Pell 方程: Wikipedia - Pell's equation

Краткое содержание задачи

Производящая функция Фибоначчи имеет вид

$$A_F(x)=\sum_{k=1}^{\infty}F_kx^k=\frac{x}{1-x-x^2}.$$

Золотой самородок в этой задаче — это положительное целое значение ряда при некотором рациональном \(x\). В задаче 137 нужно найти 15-е такое число. Ключевой факт, на котором основаны реализации, таков:

$$N_k=F_{2k}F_{2k+1}\qquad (k\ge 1),$$

поэтому искомое значение равно

$$N_{15}=F_{30}F_{31}=832040\cdot 1346269=1120149658760.$$

Математический подход

Трудность задачи не в последнем умножении, а в том, чтобы понять, почему целочисленные значения производящей функции образуют очень жесткую фибоначчиеву структуру. После этого задача перестает быть поиском по множеству рациональных \(x\) и сводится к одному индексированному произведению.

От производящей функции к квадратному условию

Пусть значение ряда равно целому числу \(n\), то есть \(A_F(x)=n\). Тогда

$$\frac{x}{1-x-x^2}=n,$$

и после преобразования получаем

$$nx^2+(n+1)x-n=0.$$

Нужный корень — положительный:

$$x=\frac{-(n+1)+\sqrt{5n^2+2n+1}}{2n}.$$

Следовательно, \(x\) может быть рациональным только в том случае, если дискриминант

$$5n^2+2n+1$$

является точным квадратом. Исходная задача тем самым превращается в диофантово условие на \(n\).

Параметризация через числа Фибоначчи

Рассмотрим рациональные числа

$$x_k=\frac{F_{2k}}{F_{2k+1}}.$$

Переписанная тождественная формула Кассини дает

$$F_{m+1}^2-F_mF_{m+1}-F_m^2=(-1)^m.$$

Если \(m=2k\) четно, правая часть равна \(1\), и потому

$$F_{2k+1}^2-F_{2k}F_{2k+1}-F_{2k}^2=1.$$

После деления на \(F_{2k+1}^2\) получаем

$$1-x_k-x_k^2=\frac{1}{F_{2k+1}^2}.$$

Подстановка в производящую функцию приводит к формуле

$$A_F(x_k)=\frac{F_{2k}/F_{2k+1}}{1/F_{2k+1}^2}=F_{2k}F_{2k+1}.$$

Значит, каждое произведение \(F_{2k}F_{2k+1}\) действительно является золотым самородком, причем соответствующее рациональное значение тоже известно явно: \(x_k=F_{2k}/F_{2k+1}\).

Почему это и есть все самородки

Если дискриминант — полный квадрат, запишем

$$m^2=5n^2+2n+1.$$

Умножение на 5 и выделение квадрата дают уравнение типа Пелля

$$5m^2-(5n+1)^2=4,$$

или, что то же самое,

$$(5n+1)^2-5m^2=-4.$$

Это в точности совпадает по форме со стандартным тождеством для чисел Лукаса и Фибоначчи,

$$L_t^2-5F_t^2=4(-1)^t.$$

Для нечетных \(t\) оно превращается в \(L_t^2-5F_t^2=-4\), то есть пары из нечетных индексов уже дают решения того же диофантова уравнения. Среди этих нечетных индексов условие \(5n+1\equiv 1\pmod 5\) выбирает именно \(t=4k+1\). Поэтому допустимые решения имеют вид

$$m=F_{4k+1},\qquad 5n+1=L_{4k+1}.$$

Остается воспользоваться стандартной формулой

$$L_{4k+1}=5F_{2k}F_{2k+1}+1,$$

после чего получаем

$$n=F_{2k}F_{2k+1}.$$

Значит, построенное выше семейство не просто дает бесконечно много самородков, а перечисляет их все: это именно произведения соседних чисел Фибоначчи с индексами \(2k\) и \(2k+1\).

Разобранный пример

Возьмем \(k=2\). Тогда

$$x=\frac{F_4}{F_5}=\frac{3}{5}.$$

Из приведенной выше формулы следует

$$1-\frac{3}{5}-\left(\frac{3}{5}\right)^2=\frac{1}{25},$$

и потому

$$A_F\left(\frac{3}{5}\right)=\frac{3/5}{1/25}=15.$$

Это второй золотой самородок. Следующий получается при \(k=3\): \(x=8/13\), а

$$A_F\left(\frac{8}{13}\right)=8\cdot 13=104.$$

Для требуемого члена надо взять \(k=15\), что дает \(F_{30}F_{31}=1120149658760\).

Как работает код

Реализации на C++, Python и Java не перебирают рациональные кандидаты \(x\) и не решают уравнение типа Пелля численно. Они сразу используют доказанную замкнутую формулу

$$N_k=F_{2k}F_{2k+1},$$

поэтому для 15-го самородка им нужны только \(F_{30}\) и \(F_{31}\).

Итерация соседних чисел Фибоначчи

В реализации хранятся два соседних числа Фибоначчи, и на каждом шаге эта пара сдвигается к следующей. Инвариант цикла прост: после завершения шага \(i\) в памяти находятся \(F_{i-1}\) и \(F_i\). Если начать с \(F_0=0\) и \(F_1=1\), то после итерации до \(i=31\) получится ровно пара \((F_{30},F_{31})\).

Формирование нужного самородка

Когда эти два значения уже вычислены, ответом служит их произведение. В одной из реализаций дополнительно проверяется известный малый случай \(N_3=104\), что совпадает с разобранным примером выше. Python и Java используют целые числа произвольной точности; в версии на C++ берется широкий фиксированный целочисленный тип, и 15-й самородок в него уверенно помещается.

Анализ сложности

Для общего индекса \(k\) алгоритм вычисляет числа Фибоначчи до \(F_{2k+1}\), поэтому время работы равно \(O(k)\). Дополнительная память составляет \(O(1)\), не считая хранения самих чисел, поскольку одновременно поддерживается только постоянное количество значений Фибоначчи.

В данной задаче с \(k=15\) фактическая работа совсем мала: 30 обновлений пары Фибоначчи и одно умножение. Сложность скрыта в выводе формулы, а не в исполнении программы.

Примечания и ссылки

  1. Страница задачи: https://projecteuler.net/problem=137
  2. Числа Фибоначчи: Wikipedia - Fibonacci number
  3. Производящие функции: Wikipedia - Generating function
  4. Тождества Кассини и Каталана: Wikipedia - Cassini and Catalan identities
  5. Числа Лукаса: Wikipedia - Lucas number
  6. Уравнение Пелля: Wikipedia - Pell's equation

ملخص المشكلة

دالة التوليد الخاصة بفيبوناتشي هي

$$A_F(x)=\sum_{k=1}^{\infty}F_kx^k=\frac{x}{1-x-x^2}.$$

تسمى القيمة الصحيحة الموجبة التي تأخذها هذه السلسلة عند بعض القيم النسبية \(x\) باسم الشذرة الذهبية. في المسألة 137 نريد الشذرة الخامسة عشرة. الحقيقة الأساسية التي تعتمد عليها جميع التنفيذات هي

$$N_k=F_{2k}F_{2k+1}\qquad (k\ge 1),$$

ولذلك تكون القيمة المطلوبة

$$N_{15}=F_{30}F_{31}=832040\cdot 1346269=1120149658760.$$

المنهج الرياضي

الصعوبة الحقيقية ليست في الضرب النهائي، بل في تفسير لماذا تقع جميع القيم الصحيحة للدالة المولدة داخل نمط صارم تحكمه أعداد فيبوناتشي. بعد كشف هذا البناء، تختفي الحاجة إلى تجربة كثير من القيم النسبية لـ \(x\)، ويتحول السؤال إلى حاصل ضرب واحد محدد بالفهرس.

من الدالة المولدة إلى شرط تربيعي

لنفرض أن قيمة السلسلة هي عدد صحيح موجب \(n\)، أي \(A_F(x)=n\). عندئذ

$$\frac{x}{1-x-x^2}=n,$$

ومنها نحصل على

$$nx^2+(n+1)x-n=0.$$

الجذر المهم هو الجذر الموجب:

$$x=\frac{-(n+1)+\sqrt{5n^2+2n+1}}{2n}.$$

إذن لا يمكن أن يكون \(x\) نسبيًا إلا إذا كان المميز

$$5n^2+2n+1$$

مربعًا كاملًا. وهكذا تتحول المسألة الأصلية إلى شرط ديوفانتي يتعلق بالعدد \(n\).

تمثيل بارامتري فيبوناتشي يولد الشذرات

لنأخذ الآن الأعداد النسبية

$$x_k=\frac{F_{2k}}{F_{2k+1}}.$$

من إعادة كتابة متطابقة كاسيني نحصل على

$$F_{m+1}^2-F_mF_{m+1}-F_m^2=(-1)^m.$$

وعندما يكون \(m=2k\) زوجيًا يصبح الطرف الأيمن مساويًا لـ \(1\)، ومن ثم

$$F_{2k+1}^2-F_{2k}F_{2k+1}-F_{2k}^2=1.$$

وبالقسمة على \(F_{2k+1}^2\) نحصل على

$$1-x_k-x_k^2=\frac{1}{F_{2k+1}^2}.$$

وعند التعويض في دالة التوليد نجد أن

$$A_F(x_k)=\frac{F_{2k}/F_{2k+1}}{1/F_{2k+1}^2}=F_{2k}F_{2k+1}.$$

وبذلك يكون كل حاصل ضرب من الشكل \(F_{2k}F_{2k+1}\) شذرة ذهبية فعلًا، كما أن القيمة النسبية المقابلة له معروفة صراحة، وهي \(x_k=F_{2k}/F_{2k+1}\).

لماذا تمثل هذه الصيغة جميع الشذرات

إذا كان المميز مربعًا كاملًا، فلنكتب

$$m^2=5n^2+2n+1.$$

وبعد الضرب في 5 وإكمال المربع نحصل على معادلة من نمط بيل:

$$5m^2-(5n+1)^2=4,$$

أو بشكل مكافئ

$$(5n+1)^2-5m^2=-4.$$

وهذا يطابق تمامًا الصورة المعروفة في العلاقة بين أعداد لوكاس وأعداد فيبوناتشي:

$$L_t^2-5F_t^2=4(-1)^t.$$

عندما يكون \(t\) فرديًا تصبح هذه العلاقة \(L_t^2-5F_t^2=-4\)، أي إن الفهارس الفردية تعطي حلولًا للمعادلة الديوفانتية نفسها. ومن بين هذه الفهارس الفردية، يفرض الشرط \(5n+1\equiv 1\pmod 5\) أن يكون \(t=4k+1\). لذلك تحقق الحلول المقبولة

$$m=F_{4k+1},\qquad 5n+1=L_{4k+1}.$$

وباستخدام المتطابقة القياسية

$$L_{4k+1}=5F_{2k}F_{2k+1}+1,$$

نصل إلى

$$n=F_{2k}F_{2k+1}.$$

إذن فالعائلة التي بُنيت في الفقرة السابقة ليست مجرد أمثلة كثيرة، بل هي الوصف الكامل لجميع الشذرات الذهبية: إنها بالضبط حواصل ضرب عددين متتاليين من فيبوناتشي عند الفهرسين \(2k\) و\(2k+1\).

مثال محلول

لنأخذ \(k=2\). عندها

$$x=\frac{F_4}{F_5}=\frac{3}{5}.$$

ومن المتطابقة السابقة نحصل على

$$1-\frac{3}{5}-\left(\frac{3}{5}\right)^2=\frac{1}{25},$$

ومن ثم

$$A_F\left(\frac{3}{5}\right)=\frac{3/5}{1/25}=15.$$

وهذه هي الشذرة الذهبية الثانية. أما الحالة التالية فتأتي عند \(k=3\): حيث \(x=8/13\) ويكون

$$A_F\left(\frac{8}{13}\right)=8\cdot 13=104.$$

أما المطلوب في المسألة فينتج من \(k=15\)، وبالتالي تكون القيمة \(F_{30}F_{31}=1120149658760\).

كيف تعمل الشيفرة

تنفيذات C++ وPython وJava لا تبحث بين قيم نسبية مرشحة لـ \(x\)، ولا تحل معادلة بيل عدديًا. بل تبدأ مباشرة من الصيغة المغلقة المثبتة

$$N_k=F_{2k}F_{2k+1},$$

ولذلك لا تحتاج الشذرة الخامسة عشرة إلا إلى \(F_{30}\) و\(F_{31}\).

توليد عددين متتاليين من فيبوناتشي

تحتفظ الشيفرة دائمًا بعددين متتاليين من فيبوناتشي، ثم تستبدلهما في كل خطوة بالزوج التالي. ثابت الحلقة واضح: بعد إكمال الخطوة \(i\) يكون الزوج المخزن هو \(F_{i-1}\) و\(F_i\). وبالبدء من \(F_0=0\) و\(F_1=1\)، فإن التقدم حتى \(i=31\) يترك الزوج \((F_{30},F_{31})\) بالضبط.

تكوين الشذرة المطلوبة

بعد الوصول إلى هذين العددين، تكون الإجابة هي حاصل ضربهما. أحد التنفيذات يضيف أيضًا نقطة تحقق صغيرة هي \(N_3=104\) قبل طباعة القيمة المطلوبة، وهذا يوافق المثال المحسوب أعلاه. في Python وJava تُستخدم أعداد صحيحة ذات دقة غير محدودة، أما في C++ فتُستخدم بنية عددية صحيحة عريضة وثابتة، والقيمة الخامسة عشرة ما زالت ضمن مجالها بسهولة.

تحليل التعقيد

للفهرس العام \(k\)، تحسب الخوارزمية أعداد فيبوناتشي حتى \(F_{2k+1}\)، ولذلك يكون الزمن \(O(k)\). أما الذاكرة الإضافية فهي \(O(1)\) باستثناء تخزين الأعداد نفسها، لأن التنفيذ يحتفظ بعدد ثابت فقط من قيم فيبوناتشي في كل لحظة.

وفي هذه المسألة بالذات حيث \(k=15\)، يكون العمل الفعلي صغيرًا جدًا: 30 تحديثًا لزوج فيبوناتشي وعملية ضرب واحدة. الصعوبة كلها في الاشتقاق الرياضي، لا في زمن التنفيذ.

حواشٍ ومراجع

  1. صفحة المسألة: https://projecteuler.net/problem=137
  2. أعداد فيبوناتشي: Wikipedia - Fibonacci number
  3. الدوال المولدة: Wikipedia - Generating function
  4. متطابقات كاسيني وكاتالان: Wikipedia - Cassini and Catalan identities
  5. أعداد لوكاس: Wikipedia - Lucas number
  6. معادلة بيل: Wikipedia - Pell's equation