Problem Summary

We seek the smallest value of \(x+y+z\) with \(x \gt y \gt z \gt 0\) such that all six pairwise sums and differences

$$x+y,\quad x-y,\quad x+z,\quad x-z,\quad y+z,\quad y-z$$

are perfect squares. A direct search over triples \((x,y,z)\) is far too loose, because each candidate would still need six square tests and there is no obvious numerical range for the three variables separately.

The implementations therefore search in a more structured space: instead of guessing \(x\), \(y\), and \(z\) directly, they guess a small set of square quantities from which every other required square is forced. That is the key mathematical simplification.

Mathematical Approach

The six square conditions are strongly linked. Once the relations between them are written down explicitly, the problem collapses to a search over three squares rather than three unrestricted integers.

Naming the Six Square Quantities

Let

$$A=x+y,\qquad B=x-y,\qquad C=x+z,\qquad D=x-z,\qquad E=y+z,\qquad F=y-z.$$

Every one of \(A,B,C,D,E,F\) must be a perfect square. Because \(x \gt y \gt z \gt 0\), they satisfy the order relations

$$A \gt C \gt D \gt 0,\qquad E \gt F \gt 0,\qquad B \gt 0.$$

These six quantities are not independent. From the definitions, simple subtraction and addition give

$$F=A-C,\qquad E=A-D,\qquad B=C-E=C+D-A.$$

So once \(A\), \(C\), and \(D\) are known, the other three quantities are forced. The whole problem is therefore equivalent to finding three squares \(A \gt C \gt D \gt 0\) such that

$$A-C,\qquad A-D,\qquad C+D-A$$

are also positive perfect squares.

Recovering \(x\), \(y\), and \(z\)

After choosing a valid triple \((A,C,D)\), the original integers are reconstructed by solving the linear system

$$x+z=C,\qquad x-z=D,\qquad x+y=A.$$

This gives

$$x=\frac{C+D}{2},\qquad z=\frac{C-D}{2},\qquad y=A-\frac{C+D}{2}=\frac{E+F}{2}.$$

The target sum is then

$$x+y+z=A+\frac{C-D}{2}.$$

So the square \(A=x+y\) plays a central role: it is the largest required square and it also appears directly in the final objective.

Switching from Squares to Square Roots

The implementations do not loop over arbitrary perfect squares stored in tables. They iterate over square roots. Write

$$A=a^2,\qquad C=c^2,\qquad D=d^2,\qquad a \gt c \gt d \gt 0.$$

Then the three derived quantities become

$$F=a^2-c^2,\qquad E=a^2-d^2,\qquad B=c^2+d^2-a^2.$$

The search condition is now very compact: choose roots \(a\), \(c\), \(d\) such that all three expressions above are positive perfect squares. Once that happens, the formulas for \(x\), \(y\), and \(z\) are immediate.

Parity as a Built-In Pruning Rule

The formulas

$$x=\frac{c^2+d^2}{2},\qquad z=\frac{c^2-d^2}{2}$$

show that \(c^2\) and \(d^2\) must have the same parity. A square has the same parity as its root, so \(c\) and \(d\) must both be odd or both be even. The implementations exploit this directly: once \(c\) is fixed, the inner loop only tests values of \(d\) with matching parity. That removes half of the innermost candidates before any square check is even attempted.

The positivity condition

$$B=c^2+d^2-a^2 \gt 0$$

is another strong filter. It says the largest square \(a^2\) cannot be too far above the other two, because otherwise \(x-y\) would become non-positive.

Worked Example: The Minimal Solution

The first successful root triple found by the search is

$$a=925,\qquad c=765,\qquad d=533.$$

So the three base squares are

$$A=925^2=855625,\qquad C=765^2=585225,\qquad D=533^2=284089.$$

The three forced quantities are then

$$F=A-C=270400=520^2,$$

$$E=A-D=571536=756^2,$$

$$B=C+D-A=13689=117^2.$$

Now reconstruct the original triple:

$$x=\frac{C+D}{2}=\frac{585225+284089}{2}=434657,$$

$$y=\frac{E+F}{2}=\frac{571536+270400}{2}=420968,$$

$$z=\frac{C-D}{2}=\frac{585225-284089}{2}=150568.$$

All six required values are perfect squares:

$$x+y=855625=925^2,\qquad x-y=13689=117^2,$$

$$x+z=585225=765^2,\qquad x-z=284089=533^2,$$

$$y+z=571536=756^2,\qquad y-z=270400=520^2.$$

Therefore

$$x+y+z=434657+420968+150568=1006193.$$

How the Code Works

The C++, Python, and Java implementations all follow the same algebraic search. The outer loop chooses a root \(a\), which fixes the largest square \(A=x+y=a^2\). The middle loop chooses a smaller root \(c\), which fixes \(C=x+z=c^2\), and immediately checks whether

$$F=a^2-c^2=y-z$$

is a perfect square. Most candidates fail here, so this is an efficient early rejection step.

For each surviving pair \((a,c)\), the inner loop chooses \(d\) with the same parity as \(c\), guaranteeing that the half-sum formulas for \(x\) and \(z\) stay integral. It then forms

$$E=a^2-d^2,\qquad B=c^2+d^2-a^2$$

and requires both to be positive perfect squares. If they are, the implementation reconstructs \(x\), \(y\), and \(z\) and performs one final direct verification of all six expressions \(x\pm y\), \(x\pm z\), and \(y\pm z\).

That final verification is mathematically redundant once every identity above is correct, but it is a useful safety check. It also makes the three language versions easy to compare: they all implement exactly the same sequence of derived-square tests followed by a direct confirmation.

Complexity Analysis

If the square-root search limit is \(L\), the raw nested loops are cubic, so the worst-case running time is \(O(L^3)\). The parity restriction removes half of the innermost iterations, and the square tests on \(a^2-c^2\), \(a^2-d^2\), and \(c^2+d^2-a^2\) prune the overwhelming majority of candidates before the expensive final six-square confirmation.

The memory usage is \(O(1)\): the algorithm keeps only a fixed number of integers and square-test temporaries. In practice it is fast because it never searches blindly over all \((x,y,z)\); instead it walks through the much smaller state space of compatible square differences.

Footnotes and References

  1. Problem page: Project Euler 142 - Perfect Square Collection
  2. Perfect square: Wikipedia - Square number
  3. Difference of two squares: Wikipedia - Difference of two squares
  4. Diophantine equation: Wikipedia - Diophantine equation
  5. Parity: Wikipedia - Parity

Problemzusammenfassung

Gesucht ist der kleinste Wert von \(x+y+z\) mit \(x \gt y \gt z \gt 0\), so dass alle sechs paarweisen Summen und Differenzen

$$x+y,\quad x-y,\quad x+z,\quad x-z,\quad y+z,\quad y-z$$

vollständige Quadrate sind. Eine direkte Suche über alle Tripel \((x,y,z)\) wäre sehr unstrukturiert, denn jede Vermutung müsste sechs Quadratbedingungen erfüllen und die drei Variablen besitzen zunächst keine gute gemeinsame Parametrisierung.

Die Implementierungen arbeiten deshalb nicht mit \((x,y,z)\) als Primärobjekten, sondern mit einer kleinen Menge quadratischer Ausdrücke, aus denen sich alle übrigen Bedingungen ableiten lassen. Genau dieser Wechsel macht das Problem handhabbar.

Mathematischer Ansatz

Die sechs Quadratbedingungen hängen linear zusammen. Sobald man diese Verknüpfungen sauber ausschreibt, reduziert sich das Problem auf die Suche nach drei Quadraten mit zusätzlichen Quadratdifferenzen.

Die Sechs Quadratgrößen benennen

Setze

$$A=x+y,\qquad B=x-y,\qquad C=x+z,\qquad D=x-z,\qquad E=y+z,\qquad F=y-z.$$

Alle Größen \(A,B,C,D,E,F\) müssen vollständige Quadrate sein. Wegen \(x \gt y \gt z \gt 0\) gilt außerdem

$$A \gt C \gt D \gt 0,\qquad E \gt F \gt 0,\qquad B \gt 0.$$

Diese sechs Werte sind aber nicht unabhängig. Aus den Definitionen folgt sofort

$$F=A-C,\qquad E=A-D,\qquad B=C-E=C+D-A.$$

Kennt man also \(A\), \(C\) und \(D\), dann sind die übrigen drei Größen bereits festgelegt. Das Problem ist damit äquivalent zur Suche nach drei Quadraten \(A \gt C \gt D \gt 0\), für die auch

$$A-C,\qquad A-D,\qquad C+D-A$$

positive Quadrate sind.

Rückgewinnung von \(x\), \(y\) und \(z\)

Ist ein solches Tripel \((A,C,D)\) gefunden, erhält man die ursprünglichen Zahlen durch Lösen des linearen Systems

$$x+z=C,\qquad x-z=D,\qquad x+y=A.$$

Daraus ergibt sich

$$x=\frac{C+D}{2},\qquad z=\frac{C-D}{2},\qquad y=A-\frac{C+D}{2}=\frac{E+F}{2}.$$

Die gesuchte Summe ist also

$$x+y+z=A+\frac{C-D}{2}.$$

Damit sieht man auch, warum die Suche natürlich um die größte Quadratgröße \(A=x+y\) organisiert ist.

Von Quadraten zu Quadratwurzeln

Die Implementierungen iterieren nicht über vorberechnete Quadrattabellen, sondern direkt über Wurzeln. Schreibe

$$A=a^2,\qquad C=c^2,\qquad D=d^2,\qquad a \gt c \gt d \gt 0.$$

Dann lauten die drei abgeleiteten Bedingungen

$$F=a^2-c^2,\qquad E=a^2-d^2,\qquad B=c^2+d^2-a^2.$$

Gesucht sind also Wurzeln \(a,c,d\), für die alle drei Ausdrücke positiv und wiederum vollständige Quadrate sind. Sobald das erfüllt ist, lassen sich \(x\), \(y\) und \(z\) unmittelbar berechnen.

Parität als Suchbeschleunigung

Aus

$$x=\frac{c^2+d^2}{2},\qquad z=\frac{c^2-d^2}{2}$$

folgt, dass \(c^2\) und \(d^2\) dieselbe Parität haben müssen. Quadrate besitzen dieselbe Parität wie ihre Wurzeln, also müssen \(c\) und \(d\) entweder beide gerade oder beide ungerade sein. Genau deshalb testet die innerste Schleife nur Werte von \(d\), die dieselbe Parität wie \(c\) haben.

Hinzu kommt die Positivitätsbedingung

$$B=c^2+d^2-a^2 \gt 0,$$

die viele unmögliche Konfigurationen früh verwirft. Die größte Quadratgröße \(a^2\) darf nicht zu weit über den beiden kleineren liegen, sonst würde \(x-y\) nicht positiv bleiben.

Durchgerechnetes Beispiel: Die kleinste Lösung

Das erste erfolgreiche Wurzeltripel der Suche ist

$$a=925,\qquad c=765,\qquad d=533.$$

Damit sind die drei Ausgangsquadrate

$$A=925^2=855625,\qquad C=765^2=585225,\qquad D=533^2=284089.$$

Die erzwungenen weiteren Quadratgrößen lauten

$$F=A-C=270400=520^2,$$

$$E=A-D=571536=756^2,$$

$$B=C+D-A=13689=117^2.$$

Nun rekonstruiert man

$$x=\frac{C+D}{2}=434657,\qquad y=\frac{E+F}{2}=420968,\qquad z=\frac{C-D}{2}=150568.$$

Damit sind tatsächlich alle sechs geforderten Werte Quadrate:

$$x+y=855625=925^2,\qquad x-y=13689=117^2,$$

$$x+z=585225=765^2,\qquad x-z=284089=533^2,$$

$$y+z=571536=756^2,\qquad y-z=270400=520^2.$$

Folglich ist

$$x+y+z=434657+420968+150568=1006193.$$

Wie der Code arbeitet

Die C++-, Python- und Java-Implementierungen folgen demselben algebraischen Suchschema. Die äußere Schleife wählt eine Wurzel \(a\) und damit das größte Quadrat \(A=x+y=a^2\). Die mittlere Schleife wählt eine kleinere Wurzel \(c\) für \(C=x+z=c^2\) und prüft sofort, ob

$$F=a^2-c^2=y-z$$

ein Quadrat ist. Die meisten Kandidaten scheitern bereits an dieser ersten Differenz.

Für jedes überlebende Paar \((a,c)\) wählt die innere Schleife eine Wurzel \(d\) mit derselben Parität wie \(c\). Danach werden

$$E=a^2-d^2,\qquad B=c^2+d^2-a^2$$

gebildet und beide auf Positivität und Quadrateigenschaft getestet. Erst wenn auch diese Hürden genommen sind, werden \(x\), \(y\) und \(z\) aus den Halbierungsformeln rekonstruiert und alle sechs Ausdrücke \(x\pm y\), \(x\pm z\), \(y\pm z\) noch einmal direkt verifiziert.

Diese letzte Kontrolle ist mathematisch zwar nicht mehr zwingend nötig, aber praktisch sehr nützlich. Sie bestätigt, dass die abgeleiteten Identitäten korrekt umgesetzt wurden, und macht die drei Sprachversionen leicht vergleichbar.

Komplexitätsanalyse

Bei einer Wurzelgrenze \(L\) besitzen die verschachtelten Schleifen im Worst Case kubische Laufzeit, also \(O(L^3)\). Die Paritätsbedingung halbiert die innere Schleife, und die Tests auf \(a^2-c^2\), \(a^2-d^2\) und \(c^2+d^2-a^2\) schneiden fast alle Kandidaten schon früh ab, lange bevor die abschließende Sechs-Quadrate-Prüfung erreicht wird.

Der Speicherbedarf ist \(O(1)\), denn es werden nur einige ganzzahlige Zwischenwerte gehalten. In der Praxis ist das Verfahren schnell, weil es nicht blind durch den Raum aller \((x,y,z)\) läuft, sondern nur durch diejenigen Quadratkonfigurationen, die überhaupt algebraisch zusammenpassen können.

Fußnoten und Quellen

  1. Problemseite: Project Euler 142 - Perfect Square Collection
  2. Quadratzahl: Wikipedia - Square number
  3. Differenz zweier Quadrate: Wikipedia - Difference of two squares
  4. Diophantische Gleichung: Wikipedia - Diophantine equation
  5. Parität: Wikipedia - Parity

Problem Özeti

Aranan şey, \(x \gt y \gt z \gt 0\) koşulu altında

$$x+y,\quad x-y,\quad x+z,\quad x-z,\quad y+z,\quad y-z$$

ifadelerinin altısının da tam kare olduğu durumda en küçük \(x+y+z\) değeridir. \((x,y,z)\) üzerinde doğrudan arama yapmak verimsizdir; çünkü üç değişken için doğal bir sınır yoktur ve her aday için altı ayrı kare testi gerekir.

Uygulamalar bunun yerine daha dar bir uzayda arama yapar. Doğrudan \(x\), \(y\), \(z\) seçmek yerine, bu üç sayının oluşturduğu kare toplam ve farklardan bir kısmı seçilir; geri kalanlar cebirsel olarak zorunlu hale gelir. Asıl hız kazancı buradan gelir.

Matematiksel Yaklaşım

Altı kare koşulu birbirinden bağımsız değildir. Doğru değişken seçimiyle problem, üç serbest tamsayıdan üç uygun kare seçmeye indirgenir.

Altı Kare Niceliğini Tanımlamak

Şöyle yazalım:

$$A=x+y,\qquad B=x-y,\qquad C=x+z,\qquad D=x-z,\qquad E=y+z,\qquad F=y-z.$$

Buradaki \(A,B,C,D,E,F\) değerlerinin hepsi tam kare olmalıdır. Ayrıca \(x \gt y \gt z \gt 0\) olduğundan

$$A \gt C \gt D \gt 0,\qquad E \gt F \gt 0,\qquad B \gt 0$$

eşitsizlikleri de geçerlidir.

Bu altı nicelik bağımsız değildir. Tanımları toplayıp çıkarınca

$$F=A-C,\qquad E=A-D,\qquad B=C-E=C+D-A$$

elde edilir. Yani \(A\), \(C\) ve \(D\) biliniyorsa diğer üç nicelik otomatik olarak belirlenir. Böylece problem,

$$A-C,\qquad A-D,\qquad C+D-A$$

ifadeleri de pozitif tam kare olacak şekilde \(A \gt C \gt D \gt 0\) biçiminde üç kare bulma problemine dönüşür.

\(x\), \(y\) ve \(z\)'yi Geri Kazanmak

Geçerli bir \((A,C,D)\) üçlüsü bulunduğunda, özgün sayılar

$$x+z=C,\qquad x-z=D,\qquad x+y=A$$

denklem sisteminden elde edilir. Çözüm

$$x=\frac{C+D}{2},\qquad z=\frac{C-D}{2},\qquad y=A-\frac{C+D}{2}=\frac{E+F}{2}$$

şeklindedir. Dolayısıyla hedef toplam

$$x+y+z=A+\frac{C-D}{2}$$

olur. Bu yüzden en büyük kare olan \(A=x+y\), hem arama düzeninde hem de son ifadede merkezi rol oynar.

Karelerden Köklerine Geçmek

Uygulamalar kare değerlerini listeden seçmez; doğrudan karekökler üzerinde döner. Şöyle yazalım:

$$A=a^2,\qquad C=c^2,\qquad D=d^2,\qquad a \gt c \gt d \gt 0.$$

Bu durumda zorunlu diğer üç nicelik

$$F=a^2-c^2,\qquad E=a^2-d^2,\qquad B=c^2+d^2-a^2$$

olur. Demek ki algoritmanın yaptığı şey, \(a\), \(c\), \(d\) köklerini seçip bu üç ifadenin de pozitif tam kare olup olmadığını kontrol etmektir. Kontroller geçerse \(x\), \(y\), \(z\) doğrudan hesaplanır.

Eşlik Kısıtı ve Budama

Formüller

$$x=\frac{c^2+d^2}{2},\qquad z=\frac{c^2-d^2}{2}$$

olduğundan \(c^2\) ile \(d^2\) aynı eşlikte olmalıdır. Bir karenin eşliği kökünün eşliğiyle aynıdır; yani \(c\) ve \(d\) ya ikisi de çift ya da ikisi de tek olmalıdır. Uygulamalar bunu doğrudan kullanır ve iç döngüde \(d\)'yi 2'şer artırarak yalnızca uygun eşlikteki değerleri dener.

Ayrıca

$$B=c^2+d^2-a^2 \gt 0$$

koşulu da güçlü bir elemedir. Bu, en büyük kare \(a^2\)'nin diğer iki kareden fazla uzaklaşamayacağını söyler; aksi halde \(x-y\) sıfır ya da negatif olur ve çözüm bozulur.

Çalışılmış Örnek: En Küçük Çözüm

Aramanın bulduğu ilk başarılı kök üçlüsü

$$a=925,\qquad c=765,\qquad d=533$$

şeklindedir. Buna karşılık gelen üç temel kare

$$A=925^2=855625,\qquad C=765^2=585225,\qquad D=533^2=284089$$

olur. Buradan zorunlu diğer kareler

$$F=A-C=270400=520^2,$$

$$E=A-D=571536=756^2,$$

$$B=C+D-A=13689=117^2$$

olarak gelir.

Şimdi özgün sayıları geri kuralım:

$$x=\frac{C+D}{2}=434657,\qquad y=\frac{E+F}{2}=420968,\qquad z=\frac{C-D}{2}=150568.$$

Böylece istenen altı ifadenin hepsi gerçekten tam karedir:

$$x+y=855625=925^2,\qquad x-y=13689=117^2,$$

$$x+z=585225=765^2,\qquad x-z=284089=533^2,$$

$$y+z=571536=756^2,\qquad y-z=270400=520^2.$$

Sonuç olarak

$$x+y+z=434657+420968+150568=1006193.$$

Kod Nasıl Çalışır

C++, Python ve Java uygulamalarının üçü de aynı cebirsel aramayı uygular. Dış döngü, \(A=x+y=a^2\) olacak şekilde en büyük kareyi belirleyen \(a\) kökünü seçer. Orta döngü, \(C=x+z=c^2\) olacak şekilde daha küçük \(c\) kökünü seçer ve hemen

$$F=a^2-c^2=y-z$$

ifadesinin tam kare olup olmadığını sınar. Adayların büyük kısmı burada elenir.

Hayatta kalan her \((a,c)\) çifti için iç döngü, \(c\) ile aynı eşlikte bir \(d\) seçer. Ardından

$$E=a^2-d^2,\qquad B=c^2+d^2-a^2$$

hesaplanır ve her ikisinin de pozitif tam kare olması istenir. Bu testler de geçerse uygulama \(x\), \(y\), \(z\)'yi yarım-toplam formülleriyle çıkarır ve son aşamada \(x\pm y\), \(x\pm z\), \(y\pm z\) ifadelerinin altısını da doğrudan yeniden kontrol eder.

Bu son kontrol teoride gereksiz görünse de pratikte sağlam bir güvenlik katmanıdır. Böylece üç dildeki uygulamaların hepsi aynı türetilmiş-kare zincirini izler ve aynı nihai doğrulamayı yapar.

Karmaşıklık Analizi

Karekök üst sınırı \(L\) ise ham döngü yapısı kübiktir; yani en kötü durumda çalışma süresi \(O(L^3)\) olur. Eşlik kısıtı iç döngüyü yarıya indirir; ayrıca \(a^2-c^2\), \(a^2-d^2\) ve \(c^2+d^2-a^2\) üzerinde yapılan erken kare testleri, adayların neredeyse tamamını final doğrulamasına gelmeden eler.

Bellek kullanımı \(O(1)\)'dir; algoritma yalnızca birkaç tamsayı ve geçici kare kontrolü saklar. Pratikte hızlı olmasının nedeni, bütün \((x,y,z)\) uzayını taramaması, yalnızca cebirsel olarak uyumlu olabilecek kare yapılarını gezmesidir.

Dipnotlar ve Kaynaklar

  1. Problem sayfası: Project Euler 142 - Perfect Square Collection
  2. Tam kare: Wikipedia - Square number
  3. İki karenin farkı: Wikipedia - Difference of two squares
  4. Diofant denklemi: Wikipedia - Diophantine equation
  5. Eşlik: Wikipedia - Parity

Resumen del problema

Se busca el menor valor de \(x+y+z\) con \(x \gt y \gt z \gt 0\) tal que las seis sumas y diferencias por pares

$$x+y,\quad x-y,\quad x+z,\quad x-z,\quad y+z,\quad y-z$$

sean cuadrados perfectos. Una búsqueda directa sobre todos los ternas \((x,y,z)\) sería muy poco estructurada: habría que comprobar seis condiciones cuadráticas por candidato y no hay un modo natural de acotar las tres variables de manera independiente.

Las implementaciones evitan esa búsqueda bruta. En vez de enumerar \(x\), \(y\) y \(z\), enumeran unas pocas cantidades cuadradas de las que el resto se deduce forzosamente. Esa es la idea central del método.

Enfoque matemático

Las seis condiciones de cuadrado perfecto están ligadas por identidades lineales muy simples. Al escribirlas de forma explícita, el problema se reduce a encontrar tres cuadrados compatibles.

Nombrar las seis cantidades cuadradas

Definimos

$$A=x+y,\qquad B=x-y,\qquad C=x+z,\qquad D=x-z,\qquad E=y+z,\qquad F=y-z.$$

Los seis valores \(A,B,C,D,E,F\) deben ser cuadrados perfectos. Además, como \(x \gt y \gt z \gt 0\), se cumple

$$A \gt C \gt D \gt 0,\qquad E \gt F \gt 0,\qquad B \gt 0.$$

Pero estas cantidades no son independientes. A partir de las definiciones se obtiene

$$F=A-C,\qquad E=A-D,\qquad B=C-E=C+D-A.$$

Por tanto, si conocemos \(A\), \(C\) y \(D\), los otros tres valores quedan determinados automáticamente. Todo el problema se convierte en encontrar tres cuadrados \(A \gt C \gt D \gt 0\) tales que

$$A-C,\qquad A-D,\qquad C+D-A$$

también sean cuadrados perfectos positivos.

Recuperar \(x\), \(y\) y \(z\)

Una vez que un triple \((A,C,D)\) pasa las pruebas, se resuelve el sistema

$$x+z=C,\qquad x-z=D,\qquad x+y=A.$$

De allí sale

$$x=\frac{C+D}{2},\qquad z=\frac{C-D}{2},\qquad y=A-\frac{C+D}{2}=\frac{E+F}{2}.$$

La suma objetivo se puede escribir como

$$x+y+z=A+\frac{C-D}{2}.$$

Esto muestra por qué el mayor cuadrado \(A=x+y\) organiza naturalmente la búsqueda.

Pasar de cuadrados a raíces

Las implementaciones no recorren una tabla de cuadrados ya construida; recorren las raíces. Escribimos

$$A=a^2,\qquad C=c^2,\qquad D=d^2,\qquad a \gt c \gt d \gt 0.$$

Entonces las tres cantidades derivadas son

$$F=a^2-c^2,\qquad E=a^2-d^2,\qquad B=c^2+d^2-a^2.$$

La condición de búsqueda queda muy nítida: elegir raíces \(a\), \(c\) y \(d\) de modo que los tres valores anteriores sean positivos y, a su vez, cuadrados perfectos. Cuando eso ocurre, \(x\), \(y\) y \(z\) ya están completamente determinados.

Paridad y poda del espacio de búsqueda

Las fórmulas

$$x=\frac{c^2+d^2}{2},\qquad z=\frac{c^2-d^2}{2}$$

obligan a que \(c^2\) y \(d^2\) tengan la misma paridad. Un cuadrado tiene la misma paridad que su raíz, así que \(c\) y \(d\) deben ser simultáneamente pares o impares. Por eso la búsqueda interior avanza de dos en dos y sólo prueba raíces \(d\) con la paridad correcta.

También es importante la condición

$$B=c^2+d^2-a^2 \gt 0,$$

porque impide que el cuadrado mayor \(a^2\) quede demasiado alejado de los otros dos. Si eso ocurriera, \(x-y\) dejaría de ser positivo.

Ejemplo trabajado: la solución mínima

El primer triple de raíces que supera todas las pruebas es

$$a=925,\qquad c=765,\qquad d=533.$$

Así, los tres cuadrados de partida son

$$A=925^2=855625,\qquad C=765^2=585225,\qquad D=533^2=284089.$$

Las cantidades forzadas resultan ser

$$F=A-C=270400=520^2,$$

$$E=A-D=571536=756^2,$$

$$B=C+D-A=13689=117^2.$$

Recuperando las variables originales obtenemos

$$x=\frac{C+D}{2}=434657,\qquad y=\frac{E+F}{2}=420968,\qquad z=\frac{C-D}{2}=150568.$$

Y, en efecto, las seis expresiones pedidas son cuadrados perfectos:

$$x+y=855625=925^2,\qquad x-y=13689=117^2,$$

$$x+z=585225=765^2,\qquad x-z=284089=533^2,$$

$$y+z=571536=756^2,\qquad y-z=270400=520^2.$$

Por lo tanto,

$$x+y+z=434657+420968+150568=1006193.$$

Cómo funciona el código

Las implementaciones en C++, Python y Java siguen exactamente la misma búsqueda algebraica. El bucle exterior elige una raíz \(a\), que fija el mayor cuadrado \(A=x+y=a^2\). El bucle intermedio elige una raíz menor \(c\), que fija \(C=x+z=c^2\), y comprueba inmediatamente si

$$F=a^2-c^2=y-z$$

es un cuadrado perfecto. La mayoría de los pares se descartan en este paso temprano.

Para cada par \((a,c)\) que sobrevive, el bucle interior recorre raíces \(d\) con la misma paridad que \(c\). Luego calcula

$$E=a^2-d^2,\qquad B=c^2+d^2-a^2$$

y exige que ambos sean cuadrados positivos. Si también pasan esas pruebas, la implementación reconstruye \(x\), \(y\) y \(z\) con las fórmulas de medias semisumas y remata con una comprobación directa de las seis expresiones \(x\pm y\), \(x\pm z\) y \(y\pm z\).

Esa verificación final ya no aporta información nueva desde el punto de vista algebraico, pero es una defensa práctica contra errores de implementación y deja muy clara la correspondencia entre las tres versiones del programa.

Análisis de complejidad

Si el límite superior para las raíces es \(L\), la estructura cruda de los bucles es cúbica, es decir, \(O(L^3)\) en el peor caso. La restricción de paridad reduce a la mitad el bucle más interno, y los filtros sobre \(a^2-c^2\), \(a^2-d^2\) y \(c^2+d^2-a^2\) eliminan casi todos los candidatos mucho antes de la verificación final.

El consumo de memoria es \(O(1)\), porque sólo se mantienen unos pocos enteros y resultados temporales. En la práctica el método es eficiente precisamente porque evita una exploración ciega sobre \((x,y,z)\) y se mueve sólo dentro del espacio mucho más pequeño de diferencias de cuadrados compatibles.

Notas y referencias

  1. Página del problema: Project Euler 142 - Perfect Square Collection
  2. Cuadrado perfecto: Wikipedia - Square number
  3. Diferencia de cuadrados: Wikipedia - Difference of two squares
  4. Ecuación diofántica: Wikipedia - Diophantine equation
  5. Paridad: Wikipedia - Parity

问题概述

目标是求最小的 \(x+y+z\),其中 \(x \gt y \gt z \gt 0\),并且下面六个量全部都是完全平方数:

$$x+y,\quad x-y,\quad x+z,\quad x-z,\quad y+z,\quad y-z.$$

如果直接在 \((x,y,z)\) 上暴力搜索,空间会非常松散。每个候选都要做六次平方检验,而且三元组本身没有一个明显的自然边界。题目的可解关键在于:这六个平方量并不是互相独立的。

实现采用的不是“猜三元组再验证”的思路,而是“先选几个核心平方量,再把其余量代数推出”的思路。这样搜索空间会缩小到一类非常特殊的平方差结构。

数学方法

把六个条件写成有名字的对象之后,可以看到其中只有三个量是真正自由的,其余三个都由它们唯一决定。

给六个平方量命名

$$A=x+y,\qquad B=x-y,\qquad C=x+z,\qquad D=x-z,\qquad E=y+z,\qquad F=y-z.$$

题目要求 \(A,B,C,D,E,F\) 全部是完全平方数。又因为 \(x \gt y \gt z \gt 0\),所以这些量之间还满足

$$A \gt C \gt D \gt 0,\qquad E \gt F \gt 0,\qquad B \gt 0.$$

现在把定义式相减即可得到三个非常重要的恒等式:

$$F=A-C,\qquad E=A-D,\qquad B=C-E=C+D-A.$$

这说明只要 \(A\)、\(C\)、\(D\) 已知,其余三个平方量就不再有选择余地。于是原问题可以改写成:

寻找三个满足 \(A \gt C \gt D \gt 0\) 的平方数,使得

$$A-C,\qquad A-D,\qquad C+D-A$$

也全都是正的完全平方数。

由 \((A,C,D)\) 反推出 \(x,y,z\)

一旦找到一个满足条件的三元组 \((A,C,D)\),原始变量就可以由线性方程组

$$x+z=C,\qquad x-z=D,\qquad x+y=A$$

直接解出:

$$x=\frac{C+D}{2},\qquad z=\frac{C-D}{2},\qquad y=A-\frac{C+D}{2}=\frac{E+F}{2}.$$

因此目标和可以写成

$$x+y+z=A+\frac{C-D}{2}.$$

这也解释了为什么搜索自然地围绕最大平方 \(A=x+y\) 展开。

把平方数改写成平方根搜索

实现并不是枚举所有平方数表,而是直接枚举平方根。设

$$A=a^2,\qquad C=c^2,\qquad D=d^2,\qquad a \gt c \gt d \gt 0.$$

那么另外三个被迫出现的量就是

$$F=a^2-c^2,\qquad E=a^2-d^2,\qquad B=c^2+d^2-a^2.$$

于是算法的核心条件可以浓缩成一句话:选取整数根 \(a,c,d\),使得上面三个表达式都为正且都是完全平方数。只要这一点成立,\(x\)、\(y\)、\(z\) 就由前面的公式唯一确定。

奇偶性为什么能直接剪枝

$$x=\frac{c^2+d^2}{2},\qquad z=\frac{c^2-d^2}{2}$$

可以看出,\(c^2\) 与 \(d^2\) 必须同奇同偶,否则 \(x\) 或 \(z\) 就不会是整数。平方数的奇偶性与其平方根相同,因此 \(c\) 和 \(d\) 必须具有相同奇偶性。实现正是利用这一点,把最内层枚举步长设为 2,只测试与 \(c\) 同奇偶的 \(d\)。

另一个非常有效的筛选条件是

$$B=c^2+d^2-a^2 \gt 0.$$

它告诉我们,最大的平方 \(a^2\) 不能比另外两个平方大得过分,否则 \(x-y\) 就会变成零或负数,根本不可能满足题意。

完整算例:最小解是怎样出现的

搜索找到的第一个成功平方根三元组是

$$a=925,\qquad c=765,\qquad d=533.$$

对应的三个基础平方量为

$$A=925^2=855625,\qquad C=765^2=585225,\qquad D=533^2=284089.$$

于是其余三个量被强制为

$$F=A-C=270400=520^2,$$

$$E=A-D=571536=756^2,$$

$$B=C+D-A=13689=117^2.$$

再反推出原始三元组:

$$x=\frac{C+D}{2}=434657,\qquad y=\frac{E+F}{2}=420968,\qquad z=\frac{C-D}{2}=150568.$$

这时六个要求的量全部都确实是平方数:

$$x+y=855625=925^2,\qquad x-y=13689=117^2,$$

$$x+z=585225=765^2,\qquad x-z=284089=533^2,$$

$$y+z=571536=756^2,\qquad y-z=270400=520^2.$$

因此最小和为

$$x+y+z=434657+420968+150568=1006193.$$

代码如何工作

C++、Python 和 Java 三个实现采用同一条搜索链。外层先枚举平方根 \(a\),这一步确定最大平方 \(A=x+y=a^2\)。中层再枚举更小的平方根 \(c\),这一步确定 \(C=x+z=c^2\),并立刻检查

$$F=a^2-c^2=y-z$$

是否为完全平方数。由于绝大多数候选在这里就失败,这个早期判定非常划算。

对于通过前两层筛选的每个 \((a,c)\),最内层只枚举与 \(c\) 同奇偶的 \(d\)。随后构造

$$E=a^2-d^2,\qquad B=c^2+d^2-a^2$$

并要求二者都是正的完全平方数。如果这些条件也成立,就按前面的半和公式恢复 \(x\)、\(y\)、\(z\),最后再直接检查一次 \(x\pm y\)、\(x\pm z\)、\(y\pm z\) 这六个表达式。

从纯数学上说,最后这一步已经不再增加新的约束,因为前面的恒等式足以推出六个平方条件。但从工程实现角度看,这是一层很稳妥的保险,也让三种语言的实现逻辑完全一致。

复杂度分析

若平方根上界为 \(L\),那么原始循环结构是三重枚举,最坏时间复杂度为 \(O(L^3)\)。奇偶性限制把最内层大约减半,而对 \(a^2-c^2\)、\(a^2-d^2\)、\(c^2+d^2-a^2\) 的提前筛选又会在绝大多数情况下很早结束搜索分支,因此实际运行远快于朴素三重扫描。

空间复杂度为 \(O(1)\),因为算法只保留有限个整数中间量,不需要构造大型表格。它之所以高效,是因为它搜索的不是所有 \((x,y,z)\),而是“能够同时满足六个平方关系的平方差配置”。

注释与参考资料

  1. 题目页面: Project Euler 142 - Perfect Square Collection
  2. 完全平方数: Wikipedia - Square number
  3. 两个平方之差: Wikipedia - Difference of two squares
  4. 丢番图方程: Wikipedia - Diophantine equation
  5. 奇偶性: Wikipedia - Parity

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

Нужно найти наименьшее значение \(x+y+z\), где \(x \gt y \gt z \gt 0\), причём все шесть попарных сумм и разностей

$$x+y,\quad x-y,\quad x+z,\quad x-z,\quad y+z,\quad y-z$$

являются полными квадратами. Прямой перебор по \((x,y,z)\) слишком груб: для каждого кандидата пришлось бы отдельно проверять шесть квадратных условий, а естественной компактной параметризации тройки сразу не видно.

Реализации используют более узкое описание пространства поиска. Вместо прямого перебора самих \(x\), \(y\), \(z\) они перебирают несколько квадратных выражений, после чего остальные величины восстанавливаются по тождествам. Именно это и делает задачу вычислимой.

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

Шесть квадратных условий связаны между собой линейно. После правильного выбора обозначений становится ясно, что свободно выбирать нужно только три квадрата.

Обозначим шесть квадратных величин

Положим

$$A=x+y,\qquad B=x-y,\qquad C=x+z,\qquad D=x-z,\qquad E=y+z,\qquad F=y-z.$$

Все числа \(A,B,C,D,E,F\) должны быть полными квадратами. Так как \(x \gt y \gt z \gt 0\), дополнительно имеем

$$A \gt C \gt D \gt 0,\qquad E \gt F \gt 0,\qquad B \gt 0.$$

Но эти шесть величин не независимы. Из определений немедленно следует

$$F=A-C,\qquad E=A-D,\qquad B=C-E=C+D-A.$$

Значит, как только заданы \(A\), \(C\) и \(D\), остальные три величины уже фиксированы. Тем самым задача сводится к поиску трёх квадратов \(A \gt C \gt D \gt 0\), для которых

$$A-C,\qquad A-D,\qquad C+D-A$$

тоже являются положительными полными квадратами.

Как восстановить \(x\), \(y\) и \(z\)

Если подходящая тройка \((A,C,D)\) найдена, исходные числа определяются из системы

$$x+z=C,\qquad x-z=D,\qquad x+y=A.$$

Получаем формулы

$$x=\frac{C+D}{2},\qquad z=\frac{C-D}{2},\qquad y=A-\frac{C+D}{2}=\frac{E+F}{2}.$$

Следовательно, искомая сумма равна

$$x+y+z=A+\frac{C-D}{2}.$$

Поэтому наибольший квадрат \(A=x+y\) оказывается естественным внешним параметром поиска.

Переход к корням квадратов

В коде перебираются не сами квадратные числа как отдельные объекты, а их корни. Пусть

$$A=a^2,\qquad C=c^2,\qquad D=d^2,\qquad a \gt c \gt d \gt 0.$$

Тогда три вынужденные величины имеют вид

$$F=a^2-c^2,\qquad E=a^2-d^2,\qquad B=c^2+d^2-a^2.$$

Условие поиска становится очень простым: нужно выбрать целые \(a,c,d\) так, чтобы все три выражения выше были положительными полными квадратами. После этого \(x\), \(y\), \(z\) вычисляются напрямую.

Ограничение по чётности

Из формул

$$x=\frac{c^2+d^2}{2},\qquad z=\frac{c^2-d^2}{2}$$

следует, что \(c^2\) и \(d^2\) должны иметь одинаковую чётность. Квадрат наследует чётность своего корня, поэтому \(c\) и \(d\) должны быть либо оба чётными, либо оба нечётными. Именно поэтому внутренняя часть поиска сразу пропускает половину значений и перебирает только такие \(d\), у которых чётность совпадает с \(c\).

Ещё одно сильное условие отсечения:

$$B=c^2+d^2-a^2 \gt 0.$$

Оно говорит, что квадрат \(a^2\) не может быть слишком большим по сравнению с двумя другими; иначе \(x-y\) перестанет быть положительным.

Разобранный пример: минимальное решение

Первая успешная тройка корней в поиске такова:

$$a=925,\qquad c=765,\qquad d=533.$$

Тогда три базовых квадрата равны

$$A=925^2=855625,\qquad C=765^2=585225,\qquad D=533^2=284089.$$

Оставшиеся три величины оказываются равны

$$F=A-C=270400=520^2,$$

$$E=A-D=571536=756^2,$$

$$B=C+D-A=13689=117^2.$$

Теперь восстанавливаем исходные числа:

$$x=\frac{C+D}{2}=434657,\qquad y=\frac{E+F}{2}=420968,\qquad z=\frac{C-D}{2}=150568.$$

И действительно, все шесть требуемых выражений являются квадратами:

$$x+y=855625=925^2,\qquad x-y=13689=117^2,$$

$$x+z=585225=765^2,\qquad x-z=284089=533^2,$$

$$y+z=571536=756^2,\qquad y-z=270400=520^2.$$

Следовательно,

$$x+y+z=434657+420968+150568=1006193.$$

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

Реализации на C++, Python и Java используют одну и ту же цепочку проверок. Внешний цикл выбирает корень \(a\), тем самым фиксируя наибольший квадрат \(A=x+y=a^2\). Средний цикл выбирает меньший корень \(c\), задающий \(C=x+z=c^2\), и немедленно проверяет, является ли

$$F=a^2-c^2=y-z$$

полным квадратом. Большинство кандидатов отсеивается уже здесь.

Для каждого выжившего \((a,c)\) внутренний цикл перебирает только такие \(d\), у которых чётность совпадает с \(c\). Затем формируются величины

$$E=a^2-d^2,\qquad B=c^2+d^2-a^2$$

и обе проверяются на положительность и квадратность. Если и эти условия пройдены, программа восстанавливает \(x\), \(y\), \(z\) по формулам полусумм и в конце напрямую подтверждает все шесть выражений \(x\pm y\), \(x\pm z\), \(y\pm z\).

С математической точки зрения последняя прямая проверка уже не обязательна, но как инженерный приём она очень полезна: она подтверждает корректность всех промежуточных тождеств и делает логику трёх реализаций прозрачной.

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

Если верхняя граница для корней равна \(L\), то грубая структура вложенных циклов даёт сложность \(O(L^3)\) в худшем случае. Ограничение по чётности сокращает внутренний цикл примерно вдвое, а ранние проверки выражений \(a^2-c^2\), \(a^2-d^2\) и \(c^2+d^2-a^2\) отбрасывают почти все варианты до финальной шестикратной проверки.

Память расходуется в объёме \(O(1)\), потому что алгоритм хранит только несколько целых чисел и временных результатов. На практике метод работает быстро именно потому, что он не блуждает по всему пространству \((x,y,z)\), а перебирает только согласованные конфигурации разностей квадратов.

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

  1. Страница задачи: Project Euler 142 - Perfect Square Collection
  2. Полный квадрат: Wikipedia - Square number
  3. Разность двух квадратов: Wikipedia - Difference of two squares
  4. Диофантово уравнение: Wikipedia - Diophantine equation
  5. Чётность: Wikipedia - Parity

ملخص المسألة

نريد أصغر قيمة ممكنة لـ \(x+y+z\) بحيث \(x \gt y \gt z \gt 0\)، وتكون الكميات الست

$$x+y,\quad x-y,\quad x+z,\quad x-z,\quad y+z,\quad y-z$$

كلها مربعات كاملة. البحث المباشر في جميع الثلاثيات \((x,y,z)\) ليس مناسبًا، لأن كل مرشح يحتاج إلى ستة اختبارات تربيع، كما أن حدود المتغيرات الثلاثة ليست واضحة إذا بدأنا من الصياغة الأصلية فقط.

الفكرة الفعالة في الحل هي عدم البحث في \((x,y,z)\) مباشرة، بل البحث في عدد صغير من المقادير المربعة التي تفرض بقية المقادير تلقائيًا. بهذه الطريقة يتحول السؤال من فحص ثلاثيات عامة إلى فحص بنية عددية أكثر تقييدًا بكثير.

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

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

تسمية المقادير الستة المربعة

لنكتب

$$A=x+y,\qquad B=x-y,\qquad C=x+z,\qquad D=x-z,\qquad E=y+z,\qquad F=y-z.$$

يجب أن تكون جميع القيم \(A,B,C,D,E,F\) مربعات كاملة. وبما أن \(x \gt y \gt z \gt 0\)، فلدينا أيضًا

$$A \gt C \gt D \gt 0,\qquad E \gt F \gt 0,\qquad B \gt 0.$$

لكن هذه القيم الست ليست حرة بالكامل. من التعريفات نحصل مباشرة على

$$F=A-C,\qquad E=A-D,\qquad B=C-E=C+D-A.$$

إذن إذا عرفنا \(A\) و\(C\) و\(D\)، فإن المقادير الثلاثة الأخرى تصبح محددة تمامًا. وهذا يعني أن المسألة تكافئ البحث عن ثلاثة مربعات \(A \gt C \gt D \gt 0\) بحيث تكون

$$A-C,\qquad A-D,\qquad C+D-A$$

أيضًا مربعات كاملة موجبة.

استخراج \(x\) و\(y\) و\(z\) من هذه المقادير

بعد العثور على ثلاثية صالحة \((A,C,D)\)، يمكن استرجاع الأعداد الأصلية من النظام

$$x+z=C,\qquad x-z=D,\qquad x+y=A.$$

فنحصل على

$$x=\frac{C+D}{2},\qquad z=\frac{C-D}{2},\qquad y=A-\frac{C+D}{2}=\frac{E+F}{2}.$$

وعليه فإن المجموع المطلوب يساوي

$$x+y+z=A+\frac{C-D}{2}.$$

لذلك يظهر بوضوح أن أكبر مربع، أي \(A=x+y\)، هو المحور الطبيعي الذي تُبنى حوله عملية البحث.

الانتقال من المربعات إلى الجذور

التنفيذات لا تعدد المربعات نفسها بوصفها عناصر جاهزة، بل تعدد جذورها الصحيحة. نكتب

$$A=a^2,\qquad C=c^2,\qquad D=d^2,\qquad a \gt c \gt d \gt 0.$$

عندئذ تصبح المقادير الثلاثة المشتقة

$$F=a^2-c^2,\qquad E=a^2-d^2,\qquad B=c^2+d^2-a^2.$$

إذن جوهر الخوارزمية هو اختيار الجذور \(a,c,d\) بحيث تكون هذه التعبيرات الثلاثة موجبة ومربعات كاملة أيضًا. متى تحقق ذلك، تصبح قيم \(x\) و\(y\) و\(z\) محددة فورًا من الصيغ السابقة.

قيد التكافؤ وكيفية تقليص البحث

من العلاقتين

$$x=\frac{c^2+d^2}{2},\qquad z=\frac{c^2-d^2}{2}$$

نرى أن \(c^2\) و\(d^2\) لا بد أن يكون لهما نفس التكافؤ، وإلا فلن تكون \(x\) أو \(z\) عددًا صحيحًا. والمربع الكامل يملك نفس تكافؤ جذره، لذا يجب أن يكون \(c\) و\(d\) معًا زوجيين أو معًا فرديين. لهذا السبب يختبر التنفيذ في الحلقة الداخلية فقط قيم \(d\) التي توافق \(c\) في التكافؤ، بخطوة مقدارها 2.

وهناك مرشح إقصاء مهم آخر هو

$$B=c^2+d^2-a^2 \gt 0.$$

فهذا الشرط يقول إن المربع الأكبر \(a^2\) لا يمكن أن يبتعد كثيرًا عن المربعين الآخرين، وإلا أصبحت الكمية \(x-y\) غير موجبة، وهو ما يناقض المطلوب.

مثال محلول: الحل الأدنى

أول ثلاثية جذور تنجح في البحث هي

$$a=925,\qquad c=765,\qquad d=533.$$

وعليه تكون المربعات الأساسية الثلاثة

$$A=925^2=855625,\qquad C=765^2=585225,\qquad D=533^2=284089.$$

ثم تُفرض القيم الثلاث الأخرى على النحو التالي:

$$F=A-C=270400=520^2,$$

$$E=A-D=571536=756^2,$$

$$B=C+D-A=13689=117^2.$$

الآن نسترجع الأعداد الأصلية:

$$x=\frac{C+D}{2}=434657,\qquad y=\frac{E+F}{2}=420968,\qquad z=\frac{C-D}{2}=150568.$$

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

$$x+y=855625=925^2,\qquad x-y=13689=117^2,$$

$$x+z=585225=765^2,\qquad x-z=284089=533^2,$$

$$y+z=571536=756^2,\qquad y-z=270400=520^2.$$

إذن

$$x+y+z=434657+420968+150568=1006193.$$

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

تنفذ نسخ C++ وPython وJava السلسلة الجبرية نفسها. الحلقة الخارجية تختار الجذر \(a\)، وبذلك تثبت أكبر مربع \(A=x+y=a^2\). الحلقة الوسطى تختار جذرًا أصغر \(c\)، فيتحدد \(C=x+z=c^2\)، ثم يُفحص مباشرة ما إذا كانت الكمية

$$F=a^2-c^2=y-z$$

مربعًا كاملًا. معظم الأزواج تُرفض عند هذه النقطة المبكرة.

لكل زوج ناجح \((a,c)\)، تعدد الحلقة الداخلية فقط قيم \(d\) التي لها نفس تكافؤ \(c\). بعد ذلك تُحسب

$$E=a^2-d^2,\qquad B=c^2+d^2-a^2$$

ويُشترط أن تكونا موجبتين ومربعين كاملين. وإذا اجتازت هذه الاختبارات أيضًا، تُستعاد قيم \(x\) و\(y\) و\(z\) من صيغ أنصاف المجاميع، ثم تُجرى في النهاية مراجعة مباشرة لجميع التعبيرات الستة \(x\pm y\) و\(x\pm z\) و\(y\pm z\).

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

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

إذا كان الحد الأعلى للجذور هو \(L\)، فإن البنية الخام للحلقات المتداخلة تعطي تعقيدًا زمنيًا من رتبة \(O(L^3)\) في أسوأ الأحوال. قيد التكافؤ يقلص الحلقة الداخلية إلى النصف تقريبًا، كما أن اختبارات المربعات المبكرة على \(a^2-c^2\) و\(a^2-d^2\) و\(c^2+d^2-a^2\) تستبعد العدد الساحق من المرشحين قبل الوصول إلى الفحص النهائي.

أما الذاكرة فهي \(O(1)\)، لأن الخوارزمية لا تحتاج إلا إلى عدد ثابت من القيم الصحيحة والمؤقتات. والسبب الحقيقي لفعاليتها هو أنها لا تستكشف كل الثلاثيات \((x,y,z)\)، بل تستكشف فقط التركيبات التي يمكن أن تحقق بنية الفروق المربعة المطلوبة.

حواش ومراجع

  1. صفحة المسألة: Project Euler 142 - Perfect Square Collection
  2. المربع الكامل: Wikipedia - Square number
  3. فرق مربعين: Wikipedia - Difference of two squares
  4. معادلة ديوفانتية: Wikipedia - Diophantine equation
  5. التكافؤ: Wikipedia - Parity