Problem Summary

Let the three fruit quantities be positive integers \(a,b,c\). In the published statement, the second and third fractions share the same denominator \(a+c\), so the condition is

$$\frac{a}{b+c}+\frac{b}{a+c}+\frac{c}{a+c}=4,$$

which immediately simplifies to

$$\frac{a}{b+c}+\frac{b+c}{a+c}=4.$$

For every solution with perimeter \(p=a+b+c\le 10^7\), we must add \(p\) to the final total. A direct search over all triples would be hopeless, so the real task is to classify the integer solutions in a structured way.

Mathematical Approach

The implementations work by identifying primitive solutions, turning them into explicit parameter families, and then summing all multiples of each primitive perimeter at once.

From the Rational Identity to a Discriminant

Multiplying by \((a+c)(b+c)\) removes the denominators:

$$a(a+c)+(b+c)^2=4(a+c)(b+c).$$

After expansion this becomes the quadratic Diophantine equation

$$a^2-4ab-3ac+b^2-2bc-3c^2=0.$$

Now treat it as a quadratic in \(b\):

$$b^2-(4a+2c)b+(a^2-3ac-3c^2)=0.$$

Its discriminant is

$$\Delta=(4a+2c)^2-4(a^2-3ac-3c^2)=4(a+c)(3a+4c).$$

Therefore any integer solution must satisfy

$$b=2a+c\pm \sqrt{(a+c)(3a+4c)},$$

so \((a+c)(3a+4c)\) has to be a perfect square.

Primitive Reduction and the Key Coprimality Fact

After clearing denominators, the equation is homogeneous of degree 2. If \((a,b,c)\) is a solution, then so is \(k(a,b,c)\) for every positive integer \(k\). That means every solution is a multiple of a primitive one with \(\gcd(a,b,c)=1\).

For a primitive triple we only need one coprimality statement: \(\gcd(a,c)=1\). Indeed, if some \(d\) divides both \(a\) and \(c\), then in

$$a^2-4ab-3ac+b^2-2bc-3c^2=0$$

every term except \(b^2\) is divisible by \(d\), hence \(d\mid b^2\), so \(d\mid b\). That would force \(d\mid \gcd(a,b,c)\), contradicting primitiveness.

Now compute

$$\gcd(a+c,3a+4c)=\gcd(a+c,\;3a+4c-3(a+c))=\gcd(a+c,c)=\gcd(a,c)=1.$$

So the two factors in \((a+c)(3a+4c)\) are coprime.

Replacing One Square by Two Squares

We already know that \((a+c)(3a+4c)\) is a square, and the previous step shows the two factors are coprime. By unique factorization, each factor must therefore be a square on its own:

$$a+c=u^2,\qquad 3a+4c=v^2,\qquad \gcd(u,v)=1.$$

Solving this linear system gives

$$a=4u^2-v^2,\qquad c=v^2-3u^2.$$

Substituting back into the quadratic formula for \(b\) yields

$$b=5u^2-v^2\pm uv.$$

Thus every primitive solution has the form

$$\bigl(a,b,c\bigr)=\bigl(4u^2-v^2,\;5u^2-v^2\pm uv,\;v^2-3u^2\bigr),\qquad \gcd(u,v)=1.$$

Positivity and Perimeter Factorization

Since \(a\gt 0\) and \(c\gt 0\), we obtain

$$v^2\lt 4u^2,\qquad v^2\gt 3u^2,$$

so the valid region is the narrow strip

$$\sqrt{3}\,u \lt v \lt 2u.$$

The primitive perimeter is

$$p_\pm=a+b+c=6u^2-v^2\pm uv.$$

These expressions factor neatly:

$$p_-=(2u-v)(3u+v),\qquad p_+=(2u+v)(3u-v).$$

Those two factorizations are the bridge from the theoretical parametrization to the compact formulas used in the implementations.

Family I: \(u\) and \(v\) of Opposite Parity

Because \(\gcd(u,v)=1\), the pair cannot be both even. The first implemented family covers the case where \(u\) and \(v\) have opposite parity.

For the perimeter \(p_-\), set

$$m=u,\qquad n=2u-v,$$

so \(v=2m-n\). Then

$$a=4mn-n^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

and

$$p_-=n(5m-n).$$

For the perimeter \(p_+\), set

$$m=2u+v,\qquad n=u,$$

so \(v=m-2n\). This gives

$$a=4mn-m^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

and

$$p_+=m(5n-m).$$

In both branches we get \(\gcd(m,n)=1\) and \(m-n\) odd. The positivity conditions on \(b\) and \(c\) imply

$$2+\sqrt{3}\lt \frac{m}{n}\lt \frac{5+\sqrt{21}}{2}\lt 5,$$

which explains why the implementations can safely scan only up to \(m\le 5n\) in this family.

Family II: \(u\) and \(v\) Both Odd

The only remaining primitive possibility is that both \(u\) and \(v\) are odd.

For the perimeter \(p_-\), define

$$m=\frac{3u-v}{2},\qquad n=\frac{v-u}{2},$$

so equivalently

$$u=m+n,\qquad v=m+3n.$$

Then

$$a=3m^2+2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

and

$$p_-=4m^2+2mn-6n^2.$$

For the perimeter \(p_+\), define

$$m=\frac{3u+v}{2},\qquad n=\frac{u+v}{2},$$

so equivalently

$$u=m-n,\qquad v=3n-m.$$

This yields

$$a=3m^2-2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

and

$$p_+=4m^2-2mn-6n^2.$$

Again \(\gcd(m,n)=1\) and \(m-n\) is odd. Here the common positivity conditions on \(b\) and \(c\) give

$$\sqrt{\frac{7}{3}}\lt \frac{m}{n}\lt \sqrt{3}\lt 2,$$

so the scan only needs \(m\le 2n\) in this second family.

Worked Example

Take the smallest primitive pair that works: \(u=4\), \(v=7\). Then

$$a=4\cdot 4^2-7^2=15,\qquad c=7^2-3\cdot 4^2=1.$$

For \(b\) we obtain

$$b=5\cdot 4^2-7^2\pm 4\cdot 7=31\pm 28\in\{3,59\}.$$

So the two primitive solutions are \((15,3,1)\) with perimeter \(19\), and \((15,59,1)\) with perimeter \(75\). If the search bound were \(N=50\), only the first triple and its double \((30,6,2)\) would contribute, producing

$$19+38=57.$$

This is exactly the small checkpoint reproduced by the implementations.

How the Code Works

Bounding the Search

For any primitive solution, \(u^2=a+c\lt a+b+c=p\le N\). So the fundamental parameters are only \(O(\sqrt{N})\), and the linear substitutions above keep the implementation parameters \(m,n\) in the same range.

Enumerating the Two Families

The C++, Python, and Java implementations loop over positive \(n\), then scan \(m\) over the two ranges implied by the derivation: up to \(5n\) for the opposite-parity family and up to \(2n\) for the odd-odd family. They enforce \(\gcd(m,n)=1\) and opposite parity, compute the corresponding formulas for \(a\), \(b\), \(c\), and discard any candidate with a nonpositive component.

Adding Every Multiple in One Step

If a primitive triple has perimeter \(p\), then every multiple \(kp\) is also valid as long as \(kp\le N\). With

$$q=\left\lfloor\frac{N}{p}\right\rfloor,$$

the total contribution of that primitive triple is

$$p+2p+\cdots+qp=p\frac{q(q+1)}{2}.$$

That closed form is why the implementations never need to generate each multiple explicitly. They also include a small brute-force verifier for low bounds, and the C++ implementation can optionally split the outer parameter range across several threads.

Complexity Analysis

Let \(N\) be the perimeter limit. The outer parameter only grows like \(\sqrt{N}\). Across all \(n\), the first family examines \(O\!\left(\sum n\right)=O(N)\) candidate pairs \((m,n)\), and the second family does the same. Each candidate uses only fixed-width integer arithmetic plus one gcd test, so in ordinary RAM-model terms the running time is \(O(N)\).

Memory usage is \(O(1)\) aside from a few counters and, in the multithreaded C++ version, a small array of partial sums. For \(N=10^7\) this leaves only a few million arithmetic checks, which is easily manageable.

Footnotes and References

  1. Problem page: https://projecteuler.net/problem=991
  2. Diophantine equation: Wikipedia - Diophantine equation
  3. Coprime integers: Wikipedia - Coprime integers
  4. Fundamental theorem of arithmetic: Wikipedia - Fundamental theorem of arithmetic
  5. Quadratic equation and discriminant: Wikipedia - Quadratic equation
  6. Arithmetic progression: Wikipedia - Arithmetic progression

Problemzusammenfassung (Problem Summary)

Bezeichne die drei Fruchtmengen mit positiven ganzen Zahlen \(a,b,c\). In der veröffentlichten Fassung besitzen der zweite und der dritte Bruch denselben Nenner \(a+c\), also lautet die Bedingung

$$\frac{a}{b+c}+\frac{b}{a+c}+\frac{c}{a+c}=4,$$

und damit sofort

$$\frac{a}{b+c}+\frac{b+c}{a+c}=4.$$

Für jede Lösung mit Umfang \(p=a+b+c\le 10^7\) soll \(p\) zur Endsumme addiert werden. Ein direkter Durchlauf über alle Tripel wäre viel zu groß; deshalb muss man die ganzzahligen Lösungen parametrisieren.

Mathematischer Ansatz (Mathematical Approach)

Die Implementierungen bestimmen zuerst die primitiven Lösungen, schreiben diese als explizite Familien und summieren dann die Vielfachen jedes primitiven Umfangs in geschlossener Form.

Von der Bruchgleichung zur Diskriminante

Durch Multiplikation mit \((a+c)(b+c)\) verschwinden die Nenner:

$$a(a+c)+(b+c)^2=4(a+c)(b+c).$$

Ausmultipliziert ergibt das die quadratische diophantische Gleichung

$$a^2-4ab-3ac+b^2-2bc-3c^2=0.$$

Betrachtet man sie als quadratische Gleichung in \(b\), so erhält man

$$b^2-(4a+2c)b+(a^2-3ac-3c^2)=0.$$

Die Diskriminante ist

$$\Delta=(4a+2c)^2-4(a^2-3ac-3c^2)=4(a+c)(3a+4c).$$

Also muss jede ganzzahlige Lösung die Form

$$b=2a+c\pm \sqrt{(a+c)(3a+4c)}$$

haben, und damit ist \((a+c)(3a+4c)\) ein Quadrat.

Primitive Tripel und die zentrale Teilerfremdheit

Nach dem Beseitigen der Nenner ist die Gleichung homogen vom Grad 2. Wenn \((a,b,c)\) eine Lösung ist, dann ist auch \(k(a,b,c)\) für jedes positive \(k\) eine Lösung. Daher genügt es, die primitiven Tripel mit \(\gcd(a,b,c)=1\) zu klassifizieren.

Für ein primitives Tripel brauchen wir nur \(\gcd(a,c)=1\). Denn falls ein \(d\) sowohl \(a\) als auch \(c\) teilt, dann sind in

$$a^2-4ab-3ac+b^2-2bc-3c^2=0$$

alle Terme außer \(b^2\) durch \(d\) teilbar, also gilt \(d\mid b^2\) und damit \(d\mid b\). Das widerspricht der Primitivität.

Nun folgt

$$\gcd(a+c,3a+4c)=\gcd(a+c,\;3a+4c-3(a+c))=\gcd(a+c,c)=\gcd(a,c)=1.$$

Die beiden Faktoren von \((a+c)(3a+4c)\) sind also teilerfremd.

Zwei teilerfremde Quadrate

Wir wissen bereits, dass \((a+c)(3a+4c)\) ein Quadrat ist. Weil die beiden Faktoren teilerfremd sind, muss wegen der eindeutigen Primfaktorzerlegung jeder Faktor selbst ein Quadrat sein:

$$a+c=u^2,\qquad 3a+4c=v^2,\qquad \gcd(u,v)=1.$$

Das lineare Gleichungssystem liefert

$$a=4u^2-v^2,\qquad c=v^2-3u^2.$$

Zurück in der quadratischen Formel für \(b\) folgt

$$b=5u^2-v^2\pm uv.$$

Damit besitzt jedes primitive Tripel die Gestalt

$$\bigl(a,b,c\bigr)=\bigl(4u^2-v^2,\;5u^2-v^2\pm uv,\;v^2-3u^2\bigr),\qquad \gcd(u,v)=1.$$

Positivität und Faktorisierung des Umfangs

Aus \(a\gt 0\) und \(c\gt 0\) folgt

$$v^2\lt 4u^2,\qquad v^2\gt 3u^2,$$

also der schmale Bereich

$$\sqrt{3}\,u \lt v \lt 2u.$$

Der primitive Umfang ist

$$p_\pm=a+b+c=6u^2-v^2\pm uv.$$

Diese beiden Ausdrücke zerfallen in lineare Faktoren:

$$p_-=(2u-v)(3u+v),\qquad p_+=(2u+v)(3u-v).$$

Genau diese Faktorisierungen führen zu den kompakten Parametrisierungen, die der Code später durchsucht.

Familie I: \(u\) und \(v\) mit verschiedener Parität

Da \(\gcd(u,v)=1\) gilt, können \(u\) und \(v\) nicht beide gerade sein. Die erste implementierte Familie behandelt den Fall entgegengesetzter Parität.

Für den Umfang \(p_-\) setzen wir

$$m=u,\qquad n=2u-v,$$

also \(v=2m-n\). Dann erhält man

$$a=4mn-n^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

sowie

$$p_-=n(5m-n).$$

Für den Umfang \(p_+\) setzen wir

$$m=2u+v,\qquad n=u,$$

also \(v=m-2n\). Damit folgt

$$a=4mn-m^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

und

$$p_+=m(5n-m).$$

In beiden Zweigen gilt \(\gcd(m,n)=1\) und \(m-n\) ist ungerade. Aus den Positivitätsbedingungen für \(b\) und \(c\) folgt

$$2+\sqrt{3}\lt \frac{m}{n}\lt \frac{5+\sqrt{21}}{2}\lt 5,$$

weshalb der Suchbereich \(m\le 5n\) vollständig ausreicht.

Familie II: \(u\) und \(v\) beide ungerade

Die einzige verbleibende primitive Möglichkeit ist, dass \(u\) und \(v\) beide ungerade sind.

Für den Umfang \(p_-\) definieren wir

$$m=\frac{3u-v}{2},\qquad n=\frac{v-u}{2},$$

also äquivalent

$$u=m+n,\qquad v=m+3n.$$

Dann ergibt sich

$$a=3m^2+2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

und

$$p_-=4m^2+2mn-6n^2.$$

Für den Umfang \(p_+\) definieren wir

$$m=\frac{3u+v}{2},\qquad n=\frac{u+v}{2},$$

also äquivalent

$$u=m-n,\qquad v=3n-m.$$

Damit erhält man

$$a=3m^2-2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

sowie

$$p_+=4m^2-2mn-6n^2.$$

Wieder gilt \(\gcd(m,n)=1\) und \(m-n\) ist ungerade. Die gemeinsamen Positivitätsbedingungen für \(b\) und \(c\) liefern

$$\sqrt{\frac{7}{3}}\lt \frac{m}{n}\lt \sqrt{3}\lt 2,$$

also genügt hier der Bereich \(m\le 2n\).

Durchgerechnetes Beispiel

Nimm das kleinste funktionierende primitive Paar \(u=4\), \(v=7\). Dann gilt

$$a=4\cdot 4^2-7^2=15,\qquad c=7^2-3\cdot 4^2=1.$$

Für \(b\) erhält man

$$b=5\cdot 4^2-7^2\pm 4\cdot 7=31\pm 28\in\{3,59\}.$$

Die beiden primitiven Lösungen sind also \((15,3,1)\) mit Umfang \(19\) und \((15,59,1)\) mit Umfang \(75\). Bei einer Schranke \(N=50\) tragen nur das erste Tripel und sein Doppel \((30,6,2)\) bei, also insgesamt

$$19+38=57.$$

Genau dieser kleine Kontrollwert wird von den Implementierungen reproduziert.

Wie der Code arbeitet (How the Code Works)

Den Suchraum begrenzen

Für jede primitive Lösung gilt \(u^2=a+c\lt a+b+c=p\le N\). Daher liegen die fundamentalen Parameter nur in der Größenordnung \(\sqrt{N}\), und die linearen Transformationen oben halten auch die Implementierungsparameter \(m,n\) in demselben Bereich.

Die zwei Familien enumerieren

Die C++-, Python- und Java-Implementierungen laufen über positive \(n\) und durchsuchen dann \(m\) genau in den beiden aus der Herleitung kommenden Bereichen: bis \(5n\) für die Familie mit entgegengesetzter Parität und bis \(2n\) für die ungerade Familie. Dabei werden \(\gcd(m,n)=1\) und entgegengesetzte Parität erzwungen, die Formeln für \(a,b,c\) ausgewertet und alle Kandidaten mit einer nichtpositiven Komponente verworfen.

Alle Vielfachen in einem Schritt addieren

Hat ein primitives Tripel den Umfang \(p\), dann ist auch jedes Vielfache \(kp\) gültig, solange \(kp\le N\). Mit

$$q=\left\lfloor\frac{N}{p}\right\rfloor$$

ist der Gesamtbeitrag dieses primitiven Tripels

$$p+2p+\cdots+qp=p\frac{q(q+1)}{2}.$$

Deshalb muss keine Implementierung die einzelnen Vielfachen explizit erzeugen. Zusätzlich gibt es einen kleinen Brute-Force-Abgleich für niedrige Schranken; die C++-Implementierung kann den äußeren Parameterbereich außerdem optional auf mehrere Threads aufteilen.

Komplexitätsanalyse (Complexity Analysis)

Sei \(N\) die Umfangsschranke. Der äußere Parameter wächst nur wie \(\sqrt{N}\). Über alle \(n\) hinweg untersucht die erste Familie \(O\!\left(\sum n\right)=O(N)\) Kandidatenpaare \((m,n)\), und die zweite Familie ebenfalls. Jeder Kandidat benötigt nur Ganzzahlarithmetik fester Breite plus einen ggT-Test, also ist die Laufzeit im üblichen RAM-Modell \(O(N)\).

Der Speicherbedarf ist \(O(1)\), abgesehen von wenigen Zählern und im mehrfädigen C++-Fall einem kleinen Feld partieller Summen. Für \(N=10^7\) bleiben damit nur einige Millionen arithmetische Prüfungen.

Fußnoten und Quellen (Footnotes and References)

  1. Aufgabenseite: https://projecteuler.net/problem=991
  2. Diophantische Gleichung: Wikipedia - Diophantine equation
  3. Teilerfremde Zahlen: Wikipedia - Coprime integers
  4. Fundamentalsatz der Arithmetik: Wikipedia - Fundamental theorem of arithmetic
  5. Quadratische Gleichung und Diskriminante: Wikipedia - Quadratic equation
  6. Arithmetische Folge: Wikipedia - Arithmetic progression

Problem Özeti (Problem Summary)

Üç meyve miktarını pozitif tamsayılar \(a,b,c\) ile gösterelim. Yayınlanan metinde ikinci ve üçüncü kesrin paydası aynıdır; ikisi de \(a+c\) gelir. Dolayısıyla koşul

$$\frac{a}{b+c}+\frac{b}{a+c}+\frac{c}{a+c}=4$$

olur ve bu da hemen

$$\frac{a}{b+c}+\frac{b+c}{a+c}=4$$

şeklinde sadeleşir. \(p=a+b+c\le 10^7\) olan her çözüm için çevre \(p\) sonuca eklenmelidir. Bütün üçlüleri doğrudan taramak imkansız olduğu için asıl iş, çözümleri yapısal olarak sınıflandırmaktır.

Matematiksel Yaklaşım (Mathematical Approach)

Uygulamalar önce primitive çözümleri ayıklar, sonra bunları açık parametre ailelerine dönüştürür ve her primitive çevrenin tüm katlarını tek formülle toplar.

Rasyonel Özdeşlikten Diskriminanta

\((a+c)(b+c)\) ile çarpınca paydalar kaybolur:

$$a(a+c)+(b+c)^2=4(a+c)(b+c).$$

Açınca şu ikinci dereceden Diophantine denklem elde edilir:

$$a^2-4ab-3ac+b^2-2bc-3c^2=0.$$

Bunu \(b\) açısından ikinci dereceden denklem olarak okursak

$$b^2-(4a+2c)b+(a^2-3ac-3c^2)=0$$

olur. Diskriminant

$$\Delta=(4a+2c)^2-4(a^2-3ac-3c^2)=4(a+c)(3a+4c)$$

olduğundan, her tam sayı çözüm için

$$b=2a+c\pm \sqrt{(a+c)(3a+4c)}$$

yazılabilmelidir. Yani \((a+c)(3a+4c)\) mutlaka tam kare olmalıdır.

Primitive İndirgeme ve Temel Aralarında Asallık

Paydalar kaldırıldıktan sonra denklem derece 2 homojendir. \((a,b,c)\) bir çözümse, her pozitif \(k\) için \(k(a,b,c)\) de çözümdür. Bu yüzden her çözüm, \(\gcd(a,b,c)=1\) olan bir primitive çözümün katıdır.

Primitive üçlü için gereken ana gözlem \(\gcd(a,c)=1\) olmasıdır. Gerçekten bir \(d\), hem \(a\)'yı hem \(c\)'yi bölüyorsa

$$a^2-4ab-3ac+b^2-2bc-3c^2=0$$

denkleminde \(b^2\) dışındaki her terim \(d\)'ye bölünür; dolayısıyla \(d\mid b^2\), yani \(d\mid b\). Bu da \(\gcd(a,b,c)=1\) ile çelişir.

Böylece

$$\gcd(a+c,3a+4c)=\gcd(a+c,\;3a+4c-3(a+c))=\gcd(a+c,c)=\gcd(a,c)=1$$

elde edilir. Demek ki \((a+c)(3a+4c)\) çarpımındaki iki çarpan aralarında asaldır.

Tek Kare Koşulunu İki Kareye Ayırmak

\((a+c)(3a+4c)\)'nin tam kare olduğunu biliyoruz. Çarpanlar aralarında asal olduğundan, tekil asal çarpanlara ayırma gereği her biri ayrı ayrı tam kare olmalıdır:

$$a+c=u^2,\qquad 3a+4c=v^2,\qquad \gcd(u,v)=1.$$

Bu lineer sistemi çözersek

$$a=4u^2-v^2,\qquad c=v^2-3u^2$$

bulunur. Sonra \(b\) için

$$b=5u^2-v^2\pm uv$$

elde edilir. Yani her primitive çözüm

$$\bigl(a,b,c\bigr)=\bigl(4u^2-v^2,\;5u^2-v^2\pm uv,\;v^2-3u^2\bigr),\qquad \gcd(u,v)=1$$

biçimindedir.

Pozitiflik ve Çevrenin Çarpanlara Ayrılması

\(a\gt 0\) ve \(c\gt 0\) koşullarından

$$v^2\lt 4u^2,\qquad v^2\gt 3u^2$$

çıkar; yani geçerli bölge

$$\sqrt{3}\,u \lt v \lt 2u$$

şerididir. Primitive çevre ise

$$p_\pm=a+b+c=6u^2-v^2\pm uv$$

olur ve şu şekilde çarpanlara ayrılır:

$$p_-=(2u-v)(3u+v),\qquad p_+=(2u+v)(3u-v).$$

Uygulamalardaki kompakt tarama formülleri tam olarak bu iki çarpanlaşmadan doğar.

Aile I: \(u\) ve \(v\) Farklı Pariteli

\(\gcd(u,v)=1\) olduğu için \(u\) ve \(v\) aynı anda çift olamaz. Uygulamanın ilk ailesi, pariteleri farklı olan durumu kapsar.

\(p_-\) için

$$m=u,\qquad n=2u-v$$

seçelim; böylece \(v=2m-n\) olur. O zaman

$$a=4mn-n^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

ve

$$p_-=n(5m-n)$$

elde edilir. \(p_+\) için bu kez

$$m=2u+v,\qquad n=u$$

alınır; yani \(v=m-2n\). Bu da

$$a=4mn-m^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

ile

$$p_+=m(5n-m)$$

sonucunu verir. Her iki kolda da \(\gcd(m,n)=1\) ve \(m-n\) tektir. Ayrıca \(b\gt 0\) ve \(c\gt 0\) koşulları

$$2+\sqrt{3}\lt \frac{m}{n}\lt \frac{5+\sqrt{21}}{2}\lt 5$$

eşitsizliğini verdiği için taramanın \(m\le 5n\) ile sınırlandırılması yeterlidir.

Aile II: \(u\) ve \(v\) İkisi de Tek

Kalan tek primitive olasılık, \(u\) ve \(v\)'nin ikisinin de tek olmasıdır.

\(p_-\) için

$$m=\frac{3u-v}{2},\qquad n=\frac{v-u}{2}$$

tanımlayalım; eşdeğer olarak

$$u=m+n,\qquad v=m+3n.$$

Buradan

$$a=3m^2+2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

ve

$$p_-=4m^2+2mn-6n^2$$

gelir. \(p_+\) için ise

$$m=\frac{3u+v}{2},\qquad n=\frac{u+v}{2}$$

tanımıyla

$$u=m-n,\qquad v=3n-m$$

yazılır ve

$$a=3m^2-2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

ile

$$p_+=4m^2-2mn-6n^2$$

bulunur. Yine \(\gcd(m,n)=1\) ve \(m-n\) tektir. Bu ailede \(b\gt 0\) ile \(c\gt 0\) birlikte

$$\sqrt{\frac{7}{3}}\lt \frac{m}{n}\lt \sqrt{3}\lt 2$$

verdiğinden tarama için \(m\le 2n\) yeterlidir.

Çalışılmış Örnek

En küçük uygun primitive çift \(u=4\), \(v=7\)'dir. O zaman

$$a=4\cdot 4^2-7^2=15,\qquad c=7^2-3\cdot 4^2=1$$

olur. \(b\) için

$$b=5\cdot 4^2-7^2\pm 4\cdot 7=31\pm 28\in\{3,59\}$$

çıkar. Böylece iki primitive çözüm \((15,3,1)\) ve \((15,59,1)\) olur; çevreleri sırasıyla \(19\) ve \(75\)'tir. \(N=50\) olsaydı yalnızca ilk çözüm ve onun iki katı \((30,6,2)\) katkı verirdi:

$$19+38=57.$$

Uygulamaların küçük doğrulama noktasında ürettiği değer tam olarak budur.

Kod Nasıl Çalışır (How the Code Works)

Aramayı Sınırlandırmak

Her primitive çözüm için \(u^2=a+c\lt a+b+c=p\le N\) olduğundan temel parametreler yalnızca \(\sqrt{N}\) mertebesindedir. Yukarıdaki lineer dönüşümler de uygulamadaki \(m,n\) parametrelerini aynı ölçek içinde tutar.

İki Aileyi Taramak

C++, Python ve Java uygulamaları pozitif \(n\) üzerinden gider; ardından \(m\)'yi türetimde çıkan iki aralıkta tarar: farklı pariteli aile için \(5n\)'e kadar, tek-tek aile için \(2n\)'ye kadar. Her adayda \(\gcd(m,n)=1\) ve ters parite şartı kontrol edilir, ilgili \(a,b,c\) formülleri hesaplanır ve herhangi bir bileşeni pozitif olmayan adaylar atılır.

Bütün Katları Tek Adımda Toplamak

Primitive bir üçlünün çevresi \(p\) ise, \(kp\le N\) olduğu sürece her \(kp\) de geçerlidir. Bu durumda

$$q=\left\lfloor\frac{N}{p}\right\rfloor$$

olmak üzere toplam katkı

$$p+2p+\cdots+qp=p\frac{q(q+1)}{2}$$

şeklindedir. Böylece uygulamalar her katı tek tek üretmez. Düşük sınırlar için küçük bir brute-force doğrulaması da bulunur; C++ uygulaması isterse dış parametre aralığını birkaç iş parçacığına da bölebilir.

Karmaşıklık Analizi (Complexity Analysis)

Çevre sınırı \(N\) olsun. Dış parametre yalnızca \(\sqrt{N}\) gibi büyür. Tüm \(n\) değerleri boyunca ilk aile \(O\!\left(\sum n\right)=O(N)\) aday çifti \((m,n)\) inceler; ikinci aile de aynı mertebededir. Her adayda sabit genişlikte tamsayı aritmetiği ve bir EBOB testi vardır, dolayısıyla alışılmış RAM modelinde toplam süre \(O(N)\) olur.

Bellek kullanımı birkaç sayaç dışında \(O(1)\)'dir; çok iş parçacıklı C++ sürümünde buna küçük bir kısmi toplamlar dizisi eklenir. \(N=10^7\) için bu, yalnızca birkaç milyon aritmetik denetim anlamına gelir.

Dipnotlar ve Kaynaklar (Footnotes and References)

  1. Problem sayfası: https://projecteuler.net/problem=991
  2. Diophantine denklem: Wikipedia - Diophantine equation
  3. Aralarında asal sayılar: Wikipedia - Coprime integers
  4. Aritmetiğin temel teoremi: Wikipedia - Fundamental theorem of arithmetic
  5. İkinci dereceden denklem ve diskriminant: Wikipedia - Quadratic equation
  6. Aritmetik dizi: Wikipedia - Arithmetic progression

Resumen del Problema (Problem Summary)

Denotemos las tres cantidades de fruta por enteros positivos \(a,b,c\). En la version publicada, la segunda y la tercera fraccion comparten el mismo denominador \(a+c\), de modo que la condicion es

$$\frac{a}{b+c}+\frac{b}{a+c}+\frac{c}{a+c}=4,$$

y por tanto se simplifica a

$$\frac{a}{b+c}+\frac{b+c}{a+c}=4.$$

Para cada solucion con perimetro \(p=a+b+c\le 10^7\), hay que sumar \(p\) al total final. Recorrer todas las ternas directamente seria inviable; la clave es describir las soluciones enteras mediante una parametrizacion.

Enfoque Matematico (Mathematical Approach)

Las implementaciones identifican primero las soluciones primitivas, las convierten en familias explicitas y luego suman de una sola vez todos los multiplos de cada perimetro primitivo.

De la Identidad Racional al Discriminante

Multiplicando por \((a+c)(b+c)\) desaparecen los denominadores:

$$a(a+c)+(b+c)^2=4(a+c)(b+c).$$

Al expandir se obtiene la ecuacion diofantica cuadratica

$$a^2-4ab-3ac+b^2-2bc-3c^2=0.$$

Vista como ecuacion cuadratica en \(b\), queda

$$b^2-(4a+2c)b+(a^2-3ac-3c^2)=0.$$

Su discriminante es

$$\Delta=(4a+2c)^2-4(a^2-3ac-3c^2)=4(a+c)(3a+4c).$$

Por lo tanto, toda solucion entera debe satisfacer

$$b=2a+c\pm \sqrt{(a+c)(3a+4c)},$$

de donde se deduce que \((a+c)(3a+4c)\) tiene que ser un cuadrado perfecto.

Reduccion a Ternas Primitivas y Coprimalidad Clave

Tras eliminar denominadores, la ecuacion es homogenea de grado 2. Si \((a,b,c)\) es una solucion, entonces \(k(a,b,c)\) tambien lo es para cualquier entero positivo \(k\). Asi, toda solucion es un multiplo de una terna primitiva con \(\gcd(a,b,c)=1\).

Para una terna primitiva basta demostrar \(\gcd(a,c)=1\). En efecto, si un \(d\) divide a la vez a \(a\) y a \(c\), entonces en

$$a^2-4ab-3ac+b^2-2bc-3c^2=0$$

todos los terminos salvo \(b^2\) son divisibles por \(d\), luego \(d\mid b^2\) y por tanto \(d\mid b\). Eso contradice la primitividad.

Ahora

$$\gcd(a+c,3a+4c)=\gcd(a+c,\;3a+4c-3(a+c))=\gcd(a+c,c)=\gcd(a,c)=1,$$

asi que los dos factores de \((a+c)(3a+4c)\) son coprimos.

Separar un Cuadrado en Dos Cuadrados Coprimos

Ya sabemos que \((a+c)(3a+4c)\) es un cuadrado perfecto. Como los dos factores son coprimos, la factorizacion unica obliga a que cada uno sea cuadrado por separado:

$$a+c=u^2,\qquad 3a+4c=v^2,\qquad \gcd(u,v)=1.$$

Al resolver el sistema lineal se obtiene

$$a=4u^2-v^2,\qquad c=v^2-3u^2.$$

Al sustituir de nuevo en la formula cuadratica para \(b\), resulta

$$b=5u^2-v^2\pm uv.$$

Por tanto, toda solucion primitiva tiene la forma

$$\bigl(a,b,c\bigr)=\bigl(4u^2-v^2,\;5u^2-v^2\pm uv,\;v^2-3u^2\bigr),\qquad \gcd(u,v)=1.$$

Positividad y Factorizacion del Perimetro

Las condiciones \(a\gt 0\) y \(c\gt 0\) implican

$$v^2\lt 4u^2,\qquad v^2\gt 3u^2,$$

es decir, la franja

$$\sqrt{3}\,u \lt v \lt 2u.$$

El perimetro primitivo vale

$$p_\pm=a+b+c=6u^2-v^2\pm uv,$$

y se factoriza como

$$p_-=(2u-v)(3u+v),\qquad p_+=(2u+v)(3u-v).$$

Esas dos factorizaciones son exactamente las que producen las formulas compactas que luego recorre la implementacion.

Familia I: \(u\) y \(v\) de Paridad Opuesta

Como \(\gcd(u,v)=1\), no pueden ser ambos pares. La primera familia implementada cubre el caso en que tienen paridad opuesta.

Para el perimetro \(p_-\), tomamos

$$m=u,\qquad n=2u-v,$$

de modo que \(v=2m-n\). Entonces

$$a=4mn-n^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

y

$$p_-=n(5m-n).$$

Para el perimetro \(p_+\), tomamos

$$m=2u+v,\qquad n=u,$$

de manera que \(v=m-2n\). Esto produce

$$a=4mn-m^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

y

$$p_+=m(5n-m).$$

En ambas ramas se cumple \(\gcd(m,n)=1\) y \(m-n\) es impar. Ademas, las desigualdades \(b\gt 0\) y \(c\gt 0\) implican

$$2+\sqrt{3}\lt \frac{m}{n}\lt \frac{5+\sqrt{21}}{2}\lt 5,$$

lo que explica por que basta con explorar \(m\le 5n\) en esta familia.

Familia II: \(u\) y \(v\) Ambos Impares

La unica posibilidad primitiva restante es que \(u\) y \(v\) sean ambos impares.

Para el perimetro \(p_-\), definimos

$$m=\frac{3u-v}{2},\qquad n=\frac{v-u}{2},$$

equivalentemente

$$u=m+n,\qquad v=m+3n.$$

Con ello se obtiene

$$a=3m^2+2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

y

$$p_-=4m^2+2mn-6n^2.$$

Para el perimetro \(p_+\), definimos

$$m=\frac{3u+v}{2},\qquad n=\frac{u+v}{2},$$

equivalentemente

$$u=m-n,\qquad v=3n-m.$$

Entonces

$$a=3m^2-2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

y

$$p_+=4m^2-2mn-6n^2.$$

De nuevo \(\gcd(m,n)=1\) y \(m-n\) es impar. Aqui las condiciones comunes \(b\gt 0\) y \(c\gt 0\) dan

$$\sqrt{\frac{7}{3}}\lt \frac{m}{n}\lt \sqrt{3}\lt 2,$$

de modo que basta el limite \(m\le 2n\).

Ejemplo Desarrollado

Tomemos el menor par primitivo que funciona: \(u=4\), \(v=7\). Entonces

$$a=4\cdot 4^2-7^2=15,\qquad c=7^2-3\cdot 4^2=1.$$

Para \(b\) obtenemos

$$b=5\cdot 4^2-7^2\pm 4\cdot 7=31\pm 28\in\{3,59\}.$$

Las dos soluciones primitivas son \((15,3,1)\), con perimetro \(19\), y \((15,59,1)\), con perimetro \(75\). Si el limite fuera \(N=50\), solo contribuirian la primera y su doble \((30,6,2)\), con total

$$19+38=57.$$

Ese es exactamente el pequeno punto de control que reproducen las implementaciones.

Como Funciona el Codigo (How the Code Works)

Acotar la Busqueda

Para cualquier solucion primitiva se tiene \(u^2=a+c\lt a+b+c=p\le N\). Por eso los parametros fundamentales solo llegan a escala \(\sqrt{N}\), y las sustituciones lineales anteriores mantienen tambien a \(m\) y \(n\) en ese mismo orden.

Recorrer las Dos Familias

Las implementaciones en C++, Python y Java recorren \(n\) positivo y luego examinan \(m\) en los dos intervalos deducidos de la teoria: hasta \(5n\) para la familia de paridad opuesta y hasta \(2n\) para la familia impar-impar. Imponen \(\gcd(m,n)=1\) y paridad opuesta, evaluan las formulas de \(a\), \(b\), \(c\) y descartan cualquier candidato con algun componente no positivo.

Sumar Todos los Multiplos de una Vez

Si una terna primitiva tiene perimetro \(p\), entonces todo multiplo \(kp\) tambien es valido mientras \(kp\le N\). Con

$$q=\left\lfloor\frac{N}{p}\right\rfloor,$$

la contribucion total de esa terna primitiva es

$$p+2p+\cdots+qp=p\frac{q(q+1)}{2}.$$

Por eso la implementacion no genera cada multiplo de manera explicita. Tambien hay una verificacion por fuerza bruta para limites pequenos, y la version en C++ puede repartir el barrido exterior entre varios hilos.

Analisis de Complejidad (Complexity Analysis)

Sea \(N\) el limite del perimetro. El parametro exterior crece solo como \(\sqrt{N}\). Sumando sobre todos los valores de \(n\), la primera familia revisa \(O\!\left(\sum n\right)=O(N)\) pares candidatos \((m,n)\), y la segunda familia hace lo mismo. Cada candidato usa aritmetica entera de ancho fijo y una prueba de gcd, asi que en el modelo RAM habitual el tiempo total es \(O(N)\).

La memoria es \(O(1)\), salvo unos pocos acumuladores y, en la version paralela de C++, un pequeno arreglo de sumas parciales. Para \(N=10^7\), eso deja solo unos pocos millones de comprobaciones aritmeticas.

Notas y Referencias (Footnotes and References)

  1. Pagina del problema: https://projecteuler.net/problem=991
  2. Ecuacion diofantica: Wikipedia - Diophantine equation
  3. Enteros coprimos: Wikipedia - Coprime integers
  4. Teorema fundamental de la aritmetica: Wikipedia - Fundamental theorem of arithmetic
  5. Ecuacion cuadratica y discriminante: Wikipedia - Quadratic equation
  6. Progresion aritmetica: Wikipedia - Arithmetic progression

问题概述 (Problem Summary)

把三种水果的数量记为正整数 \(a,b,c\)。按照当前发布的题面,第二个分数和第三个分数的分母都是 \(a+c\),因此 条件实际上是

$$\frac{a}{b+c}+\frac{b}{a+c}+\frac{c}{a+c}=4,$$

也就是

$$\frac{a}{b+c}+\frac{b+c}{a+c}=4.$$

对于每一个满足 \(p=a+b+c\le 10^7\) 的正整数解,都要把周长 \(p\) 加入总和。直接枚举所有三元组完全不可行, 所以关键不是暴力搜索,而是把整数解按结构分类。

数学方法 (Mathematical Approach)

三份实现的核心思路一致:先刻画本原解,再把本原解改写成两个可枚举的参数族,最后把每个本原周长的全部倍数一次性加入答案。

从有理恒等式到判别式

先乘上 \((a+c)(b+c)\) 消去分母:

$$a(a+c)+(b+c)^2=4(a+c)(b+c).$$

展开后得到二次丢番图方程

$$a^2-4ab-3ac+b^2-2bc-3c^2=0.$$

把它看成关于 \(b\) 的二次方程:

$$b^2-(4a+2c)b+(a^2-3ac-3c^2)=0.$$

它的判别式为

$$\Delta=(4a+2c)^2-4(a^2-3ac-3c^2)=4(a+c)(3a+4c).$$

因此任何整数解都必须满足

$$b=2a+c\pm \sqrt{(a+c)(3a+4c)},$$

这说明 \((a+c)(3a+4c)\) 一定是完全平方数。

先约化到本原三元组

消去分母以后,方程是二次齐次的。如果 \((a,b,c)\) 是一个解,那么对任意正整数 \(k\),\(k(a,b,c)\) 仍然是解。 所以所有解都来自某个本原解,也就是 \(\gcd(a,b,c)=1\) 的解。

对本原解,最关键的结论是 \(\gcd(a,c)=1\)。理由很简单:如果某个 \(d\) 同时整除 \(a\) 和 \(c\),那么在

$$a^2-4ab-3ac+b^2-2bc-3c^2=0$$

里,除了 \(b^2\) 之外的每一项都被 \(d\) 整除,于是 \(d\mid b^2\),从而 \(d\mid b\)。这就推出 \(d\mid \gcd(a,b,c)\),与本原性矛盾。

于是

$$\gcd(a+c,3a+4c)=\gcd(a+c,\;3a+4c-3(a+c))=\gcd(a+c,c)=\gcd(a,c)=1,$$

也就是说,\((a+c)(3a+4c)\) 这两个因子本身互素。

把平方条件拆成两个互素平方

既然 \((a+c)(3a+4c)\) 是平方数,而这两个因子互素,那么由唯一分解定理可知,每个因子都必须单独是平方:

$$a+c=u^2,\qquad 3a+4c=v^2,\qquad \gcd(u,v)=1.$$

解这个线性方程组得到

$$a=4u^2-v^2,\qquad c=v^2-3u^2.$$

再代回 \(b\) 的二次公式,可得

$$b=5u^2-v^2\pm uv.$$

因此每一个本原解都可以写成

$$\bigl(a,b,c\bigr)=\bigl(4u^2-v^2,\;5u^2-v^2\pm uv,\;v^2-3u^2\bigr),\qquad \gcd(u,v)=1.$$

正性约束与周长分解

由 \(a\gt 0\) 与 \(c\gt 0\) 可知

$$v^2\lt 4u^2,\qquad v^2\gt 3u^2,$$

所以可行区域是

$$\sqrt{3}\,u \lt v \lt 2u.$$

本原周长为

$$p_\pm=a+b+c=6u^2-v^2\pm uv.$$

它恰好还能分解成

$$p_-=(2u-v)(3u+v),\qquad p_+=(2u+v)(3u-v).$$

这一步非常重要,因为实现里真正枚举的紧凑公式正是从这两个分解式变形出来的。

第一类:\(u,v\) 奇偶性相反

由于 \(\gcd(u,v)=1\),\(u\) 和 \(v\) 不可能同时为偶数。第一类实现对应的是两者奇偶性相反的情况。

对于周长 \(p_-\),令

$$m=u,\qquad n=2u-v,$$

于是 \(v=2m-n\)。代入后得到

$$a=4mn-n^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

并且

$$p_-=n(5m-n).$$

对于周长 \(p_+\),令

$$m=2u+v,\qquad n=u,$$

于是 \(v=m-2n\)。这时有

$$a=4mn-m^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

并且

$$p_+=m(5n-m).$$

这两条分支都满足 \(\gcd(m,n)=1\),而且 \(m-n\) 为奇数。再结合 \(b\gt 0\) 与 \(c\gt 0\),可以推出

$$2+\sqrt{3}\lt \frac{m}{n}\lt \frac{5+\sqrt{21}}{2}\lt 5,$$

这就解释了为什么实现里只需要把这一类扫描到 \(m\le 5n\) 即可。

第二类:\(u,v\) 都是奇数

剩下的本原情形只有 \(u\) 和 \(v\) 都是奇数。

对于周长 \(p_-\),定义

$$m=\frac{3u-v}{2},\qquad n=\frac{v-u}{2},$$

等价地写成

$$u=m+n,\qquad v=m+3n.$$

于是得到

$$a=3m^2+2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

以及

$$p_-=4m^2+2mn-6n^2.$$

对于周长 \(p_+\),定义

$$m=\frac{3u+v}{2},\qquad n=\frac{u+v}{2},$$

等价地写成

$$u=m-n,\qquad v=3n-m.$$

这时有

$$a=3m^2-2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

以及

$$p_+=4m^2-2mn-6n^2.$$

同样地,\(\gcd(m,n)=1\) 且 \(m-n\) 为奇数。由共同的正性条件 \(b\gt 0\) 与 \(c\gt 0\) 可得

$$\sqrt{\frac{7}{3}}\lt \frac{m}{n}\lt \sqrt{3}\lt 2,$$

因此这一类只需扫描到 \(m\le 2n\)。

具体例子

取最小的有效本原参数对 \(u=4\), \(v=7\)。那么

$$a=4\cdot 4^2-7^2=15,\qquad c=7^2-3\cdot 4^2=1.$$

对 \(b\) 则有

$$b=5\cdot 4^2-7^2\pm 4\cdot 7=31\pm 28\in\{3,59\}.$$

所以两个本原解分别是 \((15,3,1)\) 和 \((15,59,1)\),周长分别为 \(19\) 与 \(75\)。如果上界是 \(N=50\), 那么只有第一个三元组及其倍数 \((30,6,2)\) 会被计入,总和为

$$19+38=57.$$

这正好对应实现里使用的小规模校验值。

代码如何工作 (How the Code Works)

先把搜索范围压到 \(\sqrt{N}\)

任何本原解都满足 \(u^2=a+c\lt a+b+c=p\le N\),因此基础参数只需要到 \(\sqrt{N}\) 量级。上面的线性换元不会改变 这个量级,所以实现中的 \(m,n\) 也都只落在 \(O(\sqrt{N})\) 的范围内。

枚举两类参数族

C++、Python 和 Java 实现都会先遍历正整数 \(n\),再根据推导出的两个范围枚举 \(m\):第一类扫到 \(5n\), 第二类扫到 \(2n\)。它们统一要求 \(\gcd(m,n)=1\) 且奇偶性相反,然后用相应公式计算 \(a,b,c\),只保留三个 分量都为正的候选。

把所有倍数一次加入

如果某个本原三元组的周长是 \(p\),那么只要 \(kp\le N\),所有倍数 \(kp\) 都仍然有效。设

$$q=\left\lfloor\frac{N}{p}\right\rfloor,$$

则这个本原三元组的总贡献为

$$p+2p+\cdots+qp=p\frac{q(q+1)}{2}.$$

这就是实现不需要逐个生成倍数的原因。代码还包含一个小范围暴力校验器;其中 C++ 版本还可以把外层参数区间拆给多个线程并行求和。

复杂度分析 (Complexity Analysis)

设周长上界为 \(N\)。外层参数只增长到 \(\sqrt{N}\)。对所有 \(n\) 累加后,第一类检查的候选对 \((m,n)\) 数量是 \(O\!\left(\sum n\right)=O(N)\),第二类同样如此。每个候选只做定宽整数运算和一次 gcd 检查,因此在通常的 RAM 模型下,总时间复杂度可以视为 \(O(N)\)。

空间复杂度是 \(O(1)\):除少数计数器外几乎不需要额外存储;只有多线程的 C++ 版本会多保存一小组部分和。 对 \(N=10^7\) 而言,这只意味着几百万次算术检查。

注释与参考资料 (Footnotes and References)

  1. 题目页面: https://projecteuler.net/problem=991
  2. 丢番图方程: Wikipedia - Diophantine equation
  3. 互素整数: Wikipedia - Coprime integers
  4. 算术基本定理: Wikipedia - Fundamental theorem of arithmetic
  5. 二次方程与判别式: Wikipedia - Quadratic equation
  6. 等差数列: Wikipedia - Arithmetic progression

Краткое описание задачи (Problem Summary)

Обозначим три количества фруктов через положительные целые числа \(a,b,c\). В опубликованной формулировке у второй и третьей дробей одинаковый знаменатель \(a+c\), поэтому условие имеет вид

$$\frac{a}{b+c}+\frac{b}{a+c}+\frac{c}{a+c}=4,$$

то есть сразу упрощается до

$$\frac{a}{b+c}+\frac{b+c}{a+c}=4.$$

Для каждого решения с периметром \(p=a+b+c\le 10^7\) нужно добавить \(p\) к общей сумме. Перебирать все тройки напрямую бессмысленно; нужно описать все целочисленные решения в параметрической форме.

Математический подход (Mathematical Approach)

Все три реализации сначала классифицируют примитивные решения, затем переводят их в две явные параметрические семьи и после этого добавляют все кратные каждого примитивного периметра одной формулой.

От дробного условия к дискриминанту

Умножим на \((a+c)(b+c)\), чтобы убрать знаменатели:

$$a(a+c)+(b+c)^2=4(a+c)(b+c).$$

После раскрытия скобок получаем квадратное диофантово уравнение

$$a^2-4ab-3ac+b^2-2bc-3c^2=0.$$

Если рассматривать его как квадратное уравнение по \(b\), то

$$b^2-(4a+2c)b+(a^2-3ac-3c^2)=0.$$

Его дискриминант равен

$$\Delta=(4a+2c)^2-4(a^2-3ac-3c^2)=4(a+c)(3a+4c).$$

Следовательно, для любого целочисленного решения должно выполняться

$$b=2a+c\pm \sqrt{(a+c)(3a+4c)},$$

то есть \((a+c)(3a+4c)\) обязано быть полным квадратом.

Переход к примитивным тройкам и ключевая взаимная простота

После устранения знаменателей уравнение однородно степени 2. Если \((a,b,c)\) является решением, то и \(k(a,b,c)\) тоже является решением для любого положительного \(k\). Значит, достаточно описать примитивные тройки с \(\gcd(a,b,c)=1\).

Для примитивной тройки нужен только один важный факт: \(\gcd(a,c)=1\). Действительно, если некоторое \(d\) делит и \(a\), и \(c\), то в равенстве

$$a^2-4ab-3ac+b^2-2bc-3c^2=0$$

все члены, кроме \(b^2\), кратны \(d\). Значит, \(d\mid b^2\), откуда \(d\mid b\), а это противоречит примитивности.

Теперь получаем

$$\gcd(a+c,3a+4c)=\gcd(a+c,\;3a+4c-3(a+c))=\gcd(a+c,c)=\gcd(a,c)=1.$$

Итак, множители в \((a+c)(3a+4c)\) взаимно просты.

Два взаимно простых квадрата

Мы уже знаем, что произведение \((a+c)(3a+4c)\) является квадратом. Поскольку множители взаимно просты, из единственности разложения на простые следует, что каждый из них сам квадрат:

$$a+c=u^2,\qquad 3a+4c=v^2,\qquad \gcd(u,v)=1.$$

Решая линейную систему, находим

$$a=4u^2-v^2,\qquad c=v^2-3u^2.$$

Подстановка обратно в квадратную формулу для \(b\) дает

$$b=5u^2-v^2\pm uv.$$

Значит, каждое примитивное решение имеет вид

$$\bigl(a,b,c\bigr)=\bigl(4u^2-v^2,\;5u^2-v^2\pm uv,\;v^2-3u^2\bigr),\qquad \gcd(u,v)=1.$$

Положительность и разложение периметра

Из условий \(a\gt 0\) и \(c\gt 0\) следует

$$v^2\lt 4u^2,\qquad v^2\gt 3u^2,$$

то есть допустимая область задается неравенством

$$\sqrt{3}\,u \lt v \lt 2u.$$

Примитивный периметр равен

$$p_\pm=a+b+c=6u^2-v^2\pm uv.$$

Он красиво раскладывается на линейные множители:

$$p_-=(2u-v)(3u+v),\qquad p_+=(2u+v)(3u-v).$$

Именно эти разложения приводят к компактным формулам, которые затем перебирает программа.

Семейство I: \(u\) и \(v\) разной четности

Так как \(\gcd(u,v)=1\), числа \(u\) и \(v\) не могут быть одновременно четными. Первое семейство в реализации соответствует случаю разной четности.

Для периметра \(p_-\) положим

$$m=u,\qquad n=2u-v,$$

тогда \(v=2m-n\). После подстановки получаем

$$a=4mn-n^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

и

$$p_-=n(5m-n).$$

Для периметра \(p_+\) положим

$$m=2u+v,\qquad n=u,$$

тогда \(v=m-2n\). Это дает

$$a=4mn-m^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

и

$$p_+=m(5n-m).$$

В обеих ветвях выполняется \(\gcd(m,n)=1\), а \(m-n\) нечетно. Из условий \(b\gt 0\) и \(c\gt 0\) следует

$$2+\sqrt{3}\lt \frac{m}{n}\lt \frac{5+\sqrt{21}}{2}\lt 5,$$

поэтому в этой семье достаточно проверять только \(m\le 5n\).

Семейство II: \(u\) и \(v\) оба нечетные

Остается единственная примитивная возможность: оба числа \(u\) и \(v\) нечетные.

Для периметра \(p_-\) определим

$$m=\frac{3u-v}{2},\qquad n=\frac{v-u}{2},$$

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

$$u=m+n,\qquad v=m+3n.$$

Тогда получаем

$$a=3m^2+2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

и

$$p_-=4m^2+2mn-6n^2.$$

Для периметра \(p_+\) определим

$$m=\frac{3u+v}{2},\qquad n=\frac{u+v}{2},$$

или эквивалентно

$$u=m-n,\qquad v=3n-m.$$

Это дает

$$a=3m^2-2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

и

$$p_+=4m^2-2mn-6n^2.$$

Снова \(\gcd(m,n)=1\), а \(m-n\) нечетно. Общие условия положительности \(b\gt 0\) и \(c\gt 0\) приводят к оценке

$$\sqrt{\frac{7}{3}}\lt \frac{m}{n}\lt \sqrt{3}\lt 2,$$

поэтому здесь хватает перебора \(m\le 2n\).

Подробный пример

Возьмем наименьшую подходящую примитивную пару \(u=4\), \(v=7\). Тогда

$$a=4\cdot 4^2-7^2=15,\qquad c=7^2-3\cdot 4^2=1.$$

Для \(b\) получаем

$$b=5\cdot 4^2-7^2\pm 4\cdot 7=31\pm 28\in\{3,59\}.$$

Следовательно, две примитивные тройки таковы: \((15,3,1)\) с периметром \(19\) и \((15,59,1)\) с периметром \(75\). Если бы предел был \(N=50\), то вклад дали бы только первая тройка и ее удвоение \((30,6,2)\):

$$19+38=57.$$

Именно это малое контрольное значение воспроизводят реализации.

Как работает код (How the Code Works)

Ограничение области поиска

Для любой примитивной тройки выполняется \(u^2=a+c\lt a+b+c=p\le N\). Значит, базовые параметры имеют порядок только \(\sqrt{N}\), а описанные выше линейные замены сохраняют тот же масштаб и для параметров \(m,n\).

Перебор двух семейств

Реализации на C++, Python и Java перебирают положительные \(n\), а затем рассматривают \(m\) в двух интервалах, выведенных из формул: до \(5n\) для семейства разной четности и до \(2n\) для семейства нечетных \(u,v\). Они требуют \(\gcd(m,n)=1\) и разную четность, вычисляют соответствующие значения \(a,b,c\) и отбрасывают все случаи, где хотя бы одна компонента неположительна.

Суммирование всех кратных одним действием

Если примитивная тройка имеет периметр \(p\), то любой кратный периметр \(kp\) тоже допустим, пока \(kp\le N\). При

$$q=\left\lfloor\frac{N}{p}\right\rfloor$$

общий вклад этой примитивной тройки равен

$$p+2p+\cdots+qp=p\frac{q(q+1)}{2}.$$

Поэтому код не генерирует каждое кратное отдельно. Кроме того, в нем есть небольшая проверка полным перебором для малых границ, а реализация на C++ может при желании разделить внешний диапазон параметров между несколькими потоками.

Анализ сложности (Complexity Analysis)

Пусть \(N\) обозначает ограничение на периметр. Внешний параметр растет только как \(\sqrt{N}\). Если суммировать по всем \(n\), то первое семейство проверяет \(O\!\left(\sum n\right)=O(N)\) кандидатных пар \((m,n)\), и второе семейство делает то же самое. Для каждого кандидата нужны только целочисленные операции фиксированной ширины и один тест gcd, так что в стандартной RAM-модели время работы равно \(O(N)\).

Память имеет порядок \(O(1)\): кроме нескольких счетчиков почти ничего не хранится; только многопоточная версия на C++ использует небольшой массив частичных сумм. Для \(N=10^7\) это означает лишь несколько миллионов арифметических проверок.

Примечания и ссылки (Footnotes and References)

  1. Страница задачи: https://projecteuler.net/problem=991
  2. Диофантово уравнение: Wikipedia - Diophantine equation
  3. Взаимно простые числа: Wikipedia - Coprime integers
  4. Основная теорема арифметики: Wikipedia - Fundamental theorem of arithmetic
  5. Квадратное уравнение и дискриминант: Wikipedia - Quadratic equation
  6. Арифметическая прогрессия: Wikipedia - Arithmetic progression

ملخص المسألة (Problem Summary)

لنرمز إلى كميات الفاكهة الثلاثة بالأعداد الصحيحة الموجبة \(a,b,c\). في الصيغة المنشورة من المسألة، يملك الكسران الثاني والثالث المقام نفسه \(a+c\)، ولذلك يصبح الشرط

$$\frac{a}{b+c}+\frac{b}{a+c}+\frac{c}{a+c}=4,$$

أي مباشرة

$$\frac{a}{b+c}+\frac{b+c}{a+c}=4.$$

لكل حل يحقق \(p=a+b+c\le 10^7\) يجب أن نضيف المحيط \(p\) إلى المجموع النهائي. ومن الواضح أن الفحص المباشر لكل الثلاثيات غير ممكن عمليا، لذلك لا بد من تصنيف الحلول الصحيحة بطريقة بنيوية.

المنهج الرياضي (Mathematical Approach)

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

من الهوية الكسرية إلى المميز

نضرب أولا في \((a+c)(b+c)\) للتخلص من المقامات:

$$a(a+c)+(b+c)^2=4(a+c)(b+c).$$

وبعد التوسيع نحصل على المعادلة الديوفانتية التربيعية

$$a^2-4ab-3ac+b^2-2bc-3c^2=0.$$

وإذا اعتبرناها معادلة تربيعية في \(b\)، فإنها تصبح

$$b^2-(4a+2c)b+(a^2-3ac-3c^2)=0.$$

ومميزها هو

$$\Delta=(4a+2c)^2-4(a^2-3ac-3c^2)=4(a+c)(3a+4c).$$

لذلك لا بد أن يحقق كل حل صحيح

$$b=2a+c\pm \sqrt{(a+c)(3a+4c)},$$

وهذا يعني أن \((a+c)(3a+4c)\) يجب أن يكون مربعا كاملا.

الاختزال إلى ثلاثيات أولية وحقيقة التباين الأولي

بعد إزالة المقامات تصبح المعادلة متجانسة من الدرجة الثانية. فإذا كانت \((a,b,c)\) حلا، فإن \(k(a,b,c)\) يبقى حلا لكل عدد صحيح موجب \(k\). ومن ثم فإن كل حل هو مضاعف لحل أولي يحقق \(\gcd(a,b,c)=1\).

في الحالة الأولية نحتاج إلى حقيقة أساسية واحدة فقط، وهي \(\gcd(a,c)=1\). فإذا كان هناك \(d\) يقسم كلا من \(a\) و\(c\)، فإن جميع الحدود في

$$a^2-4ab-3ac+b^2-2bc-3c^2=0$$

عدا \(b^2\) تكون قابلة للقسمة على \(d\)، وبالتالي \(d\mid b^2\)، ومنه \(d\mid b\). وهذا يناقض أولية الثلاثية.

وعندئذ نحصل على

$$\gcd(a+c,3a+4c)=\gcd(a+c,\;3a+4c-3(a+c))=\gcd(a+c,c)=\gcd(a,c)=1.$$

أي إن العاملين في \((a+c)(3a+4c)\) متباينان أوليا.

تحويل شرط المربع إلى مربعين متباينين أوليا

بما أن \((a+c)(3a+4c)\) مربع كامل، وبما أن العاملين متباينان أوليا، فإن التحليل الأولي الفريد يفرض أن يكون كل عامل منهما مربعا كاملا على حدة:

$$a+c=u^2,\qquad 3a+4c=v^2,\qquad \gcd(u,v)=1.$$

بحل هذا النظام الخطي نحصل على

$$a=4u^2-v^2,\qquad c=v^2-3u^2.$$

ثم بالتعويض في صيغة \(b\) التربيعية نجد

$$b=5u^2-v^2\pm uv.$$

إذن كل حل أولي يكتب على الصورة

$$\bigl(a,b,c\bigr)=\bigl(4u^2-v^2,\;5u^2-v^2\pm uv,\;v^2-3u^2\bigr),\qquad \gcd(u,v)=1.$$

شروط الإيجابية وتحليل المحيط

من الشرطين \(a\gt 0\) و\(c\gt 0\) نحصل على

$$v^2\lt 4u^2,\qquad v^2\gt 3u^2,$$

أي إن المجال المسموح هو

$$\sqrt{3}\,u \lt v \lt 2u.$$

أما المحيط الأولي فهو

$$p_\pm=a+b+c=6u^2-v^2\pm uv.$$

وهذا يتفكك إلى

$$p_-=(2u-v)(3u+v),\qquad p_+=(2u+v)(3u-v).$$

وهذان التحليلان هما الجسر المباشر بين البرهان النظري والصيغ المضغوطة التي تستعملها التطبيقات.

العائلة الأولى: \(u\) و\(v\) مختلفا الفردية

بما أن \(\gcd(u,v)=1\)، فلا يمكن أن يكونا زوجيين معا. العائلة الأولى في التطبيق تغطي حالة اختلاف الفردية.

بالنسبة إلى المحيط \(p_-\)، نضع

$$m=u,\qquad n=2u-v,$$

وعندها \(v=2m-n\). فنحصل على

$$a=4mn-n^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

وكذلك

$$p_-=n(5m-n).$$

وبالنسبة إلى المحيط \(p_+\)، نضع

$$m=2u+v,\qquad n=u,$$

وعندها \(v=m-2n\). وهذا يعطي

$$a=4mn-m^2,\qquad b=5mn-m^2-n^2,\qquad c=m^2-4mn+n^2,$$

مع

$$p_+=m(5n-m).$$

وفي كلا الفرعين لدينا \(\gcd(m,n)=1\) و\(m-n\) عدد فردي. كما أن الشرطين \(b\gt 0\) و\(c\gt 0\) يؤديان إلى

$$2+\sqrt{3}\lt \frac{m}{n}\lt \frac{5+\sqrt{21}}{2}\lt 5,$$

ولهذا يكفي أن تمسح الخوارزمية هذه العائلة حتى \(m\le 5n\).

العائلة الثانية: \(u\) و\(v\) فرديان معا

لا يبقى من الحالات الأولية إلا أن يكون \(u\) و\(v\) فرديين معا.

للمحيط \(p_-\)، نعرف

$$m=\frac{3u-v}{2},\qquad n=\frac{v-u}{2},$$

أي بصورة مكافئة

$$u=m+n,\qquad v=m+3n.$$

وبالتعويض نحصل على

$$a=3m^2+2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

وكذلك

$$p_-=4m^2+2mn-6n^2.$$

أما للمحيط \(p_+\)، فنأخذ

$$m=\frac{3u+v}{2},\qquad n=\frac{u+v}{2},$$

أي بصورة مكافئة

$$u=m-n,\qquad v=3n-m.$$

فنحصل على

$$a=3m^2-2mn-5n^2,\qquad b=3m^2-7n^2,\qquad c=2(3n^2-m^2),$$

ومعها

$$p_+=4m^2-2mn-6n^2.$$

ومرة أخرى يكون \(\gcd(m,n)=1\) و\(m-n\) فرديا. ومن الشرطين المشتركين \(b\gt 0\) و\(c\gt 0\) نحصل على

$$\sqrt{\frac{7}{3}}\lt \frac{m}{n}\lt \sqrt{3}\lt 2,$$

ولذلك يكفي هنا المسح حتى \(m\le 2n\).

مثال محلول

لنأخذ أصغر زوج أولي صالح وهو \(u=4\)، \(v=7\). عندئذ

$$a=4\cdot 4^2-7^2=15,\qquad c=7^2-3\cdot 4^2=1.$$

أما \(b\) فيساوي

$$b=5\cdot 4^2-7^2\pm 4\cdot 7=31\pm 28\in\{3,59\}.$$

إذن الحلان الأوليان هما \((15,3,1)\) بمحيط \(19\)، و\((15,59,1)\) بمحيط \(75\). ولو كان الحد \(N=50\)، فلن يدخل في المجموع إلا الحل الأول ومضاعفه \((30,6,2)\)، فتكون الحصيلة

$$19+38=57.$$

وهذا بالضبط هو التحقق الصغير الذي تعيده التطبيقات.

كيف يعمل الكود (How the Code Works)

حصر مجال البحث

لكل حل أولي لدينا \(u^2=a+c\lt a+b+c=p\le N\). ولهذا فإن المعاملات الأساسية لا تصل إلا إلى رتبة \(\sqrt{N}\)، كما أن التحويلات الخطية السابقة تُبقي معاملي التنفيذ \(m,n\) ضمن الرتبة نفسها.

تعداد العائلتين

تقوم تطبيقات C++ وPython وJava بالمرور على \(n\) الموجب، ثم تفحص \(m\) في المجالين المستنتجين من الاشتقاق: حتى \(5n\) للعائلة ذات الفردية المختلفة، وحتى \(2n\) للعائلة التي يكون فيها \(u\) و\(v\) فرديين. وهي تفرض الشرطين \(\gcd(m,n)=1\) واختلاف الفردية، ثم تحسب صيغ \(a,b,c\) المناسبة، وتستبعد كل مرشح يحتوي عنصرا غير موجب.

جمع جميع المضاعفات دفعة واحدة

إذا كان للمثلث الأولي محيط \(p\)، فإن كل مضاعف \(kp\) يبقى صالحا ما دام \(kp\le N\). ومع

$$q=\left\lfloor\frac{N}{p}\right\rfloor$$

تكون مساهمة هذا الحل الأولي

$$p+2p+\cdots+qp=p\frac{q(q+1)}{2}.$$

ولهذا لا تحتاج التطبيقات إلى توليد كل مضاعف على حدة. كما يوجد فاحص brute-force صغير للحدود المنخفضة، وتستطيع نسخة C++ عند الرغبة تقسيم المجال الخارجي على عدة خيوط.

تحليل التعقيد (Complexity Analysis)

ليكن \(N\) حد المحيط. إن المعامل الخارجي ينمو فقط مثل \(\sqrt{N}\). وعند الجمع على جميع قيم \(n\)، فإن العائلة الأولى تفحص \(O\!\left(\sum n\right)=O(N)\) من الأزواج المرشحة \((m,n)\)، والعائلة الثانية تفعل الشيء نفسه. وكل مرشح يحتاج فقط إلى حسابات صحيحة ثابتة العرض واختبار gcd واحد، لذا يكون الزمن الكلي \(O(N)\) في نموذج RAM المعتاد.

أما الذاكرة فهي \(O(1)\) باستثناء بضعة مجاميع وعدادات، ومع النسخة متعددة الخيوط في C++ توجد أيضا مصفوفة صغيرة للمجاميع الجزئية. وعند \(N=10^7\) يعني هذا بضع ملايين فقط من الفحوص الحسابية.

حواشٍ ومراجع (Footnotes and References)

  1. صفحة المسألة: https://projecteuler.net/problem=991
  2. المعادلة الديوفانتية: Wikipedia - Diophantine equation
  3. الأعداد المتباينة أوليا: Wikipedia - Coprime integers
  4. النظرية الأساسية في الحساب: Wikipedia - Fundamental theorem of arithmetic
  5. المعادلة التربيعية والمميز: Wikipedia - Quadratic equation
  6. المتتالية الحسابية: Wikipedia - Arithmetic progression