Problem Summary

A magic 5-gon ring uses the numbers \(1\) through \(10\) exactly once. Five numbers sit on the inner pentagon and five on the outer pentagon. Each line has the form \((o_k,i_k,i_{k+1})\), where the outer node \(o_k\) is joined to two consecutive inner nodes \(i_k\) and \(i_{k+1}\), and all five lines must have the same sum.

The ring is encoded by concatenating the five line triples, starting from the line whose outer node is numerically smallest and then continuing clockwise. The goal is not merely to find a valid magic ring, but to find the largest possible 16-digit string under that canonical reading rule.

Mathematical Approach

Write the inner cycle as \(i_1,i_2,i_3,i_4,i_5\) and the outer nodes as \(o_1,o_2,o_3,o_4,o_5\). Then the magic condition is

$$o_1+i_1+i_2=o_2+i_2+i_3=o_3+i_3+i_4=o_4+i_4+i_5=o_5+i_5+i_1=S.$$

The whole problem is controlled by these five equations, by one global sum identity, and by the special role of the number \(10\) in the final string length.

Deriving the outer ring from an ordered inner cycle

Once an order for the inner cycle is fixed, choosing one outer node already determines the common line sum. If we start with \(o_1\), then

$$S=o_1+i_1+i_2.$$

Every other outer node is forced:

$$o_2=S-i_2-i_3,\quad o_3=S-i_3-i_4,\quad o_4=S-i_4-i_5,\quad o_5=S-i_5-i_1.$$

So a candidate ring is valid exactly when these five derived outer values are the five numbers not used on the inner ring, with no repetition and no missing value. This is the central structural simplification: the search never needs to permute all ten positions independently.

The total-sum invariant

Each outer node appears in exactly one line, while each inner node appears in exactly two lines. Summing all five line sums therefore gives

$$5S=(o_1+o_2+o_3+o_4+o_5)+2(i_1+i_2+i_3+i_4+i_5).$$

Because the ten numbers are \(1,2,\dots,10\), their total is \(55\). If \(I=i_1+i_2+i_3+i_4+i_5\), then the outer sum is \(55-I\), and hence

$$5S=(55-I)+2I=55+I.$$

Therefore \(I\) must be divisible by \(5\), and once the inner set is known, the common line sum is fixed by

$$S=\frac{55+I}{5}.$$

This does not by itself solve the arrangement problem, but it sharply limits which inner sets can possibly work.

Why a 16-digit solution forces \(10\) onto the outer ring

The concatenated representation contains every outer number once and every inner number twice, because each inner node belongs to two adjacent lines. If every number were one digit long, the string would have \(15\) digits. The only extra digit comes from the number \(10\).

If \(10\) is on the outer ring, it appears once in the concatenation, so the total length becomes \(15+1=16\). If \(10\) is on the inner ring, it appears twice, so the total length becomes \(15+2=17\). Hence every valid 16-digit candidate must place \(10\) on the outer ring.

Canonical order and lexicographic pressure

The reading rule starts at the numerically smallest outer node. That choice removes rotational ambiguity: the same ring may be rotated in five ways geometrically, but only one rotation is allowed in the string representation.

It also matters for maximization. The very first digit block begins with the smallest outer node, so to maximize the full string we want that smallest outer value to be as large as possible. Since \(10\) must already be outside, the best possible outer set is \(\{6,7,8,9,10\}\), whose minimum is \(6\). That forces the inner set to be \(\{1,2,3,4,5\}\), and then

$$S=\frac{55+(1+2+3+4+5)}{5}=\frac{70}{5}=14.$$

The exhaustive search in the implementations confirms that the maximum 16-digit string does indeed come from this strongest candidate family.

Worked example: the optimal ring

Take the inner cycle in clockwise order as

$$ (i_1,i_2,i_3,i_4,i_5)=(5,3,1,4,2). $$

With \(S=14\), the outer nodes are forced to be

$$o_1=14-5-3=6,\quad o_2=14-3-1=10,\quad o_3=14-1-4=9,\quad o_4=14-4-2=8,\quad o_5=14-2-5=7.$$

So the five lines are

$$ (6,5,3),\ (10,3,1),\ (9,1,4),\ (8,4,2),\ (7,2,5), $$

and every one of them sums to \(14\). The canonical concatenation is therefore

$$6531031914842725,$$

which is exactly the maximal 16-digit string returned by the search.

How the Code Works

The C++, Python, and Java implementations use a direct enumeration, but they enumerate only the mathematically meaningful degrees of freedom. They split the ten numbers into an inner 5-set and its outer complement, try every ordering of the inner cycle, choose one candidate starting outer node, and then let the equal-sum equations derive the other four outer nodes automatically.

The implementations do not hard-code every theoretical pruning rule. For example, they do not explicitly pre-filter to “\(10\) must be outside” or “the inner sum must be divisible by \(5\).” Instead, they keep the code simple: generate a candidate, compute the implied outer ring, and reject it unless the derived outer multiset matches the unused numbers exactly.

After that, they enforce the canonical reading rule by requiring the chosen first outer node to be the smallest among the five outer nodes. This removes rotational duplicates. The five triples are then concatenated clockwise. If the resulting string has length \(16\) and is lexicographically larger than the current best, it replaces the previous best. Reversed orientations are still encountered through different inner orders, but that is harmless because only the maximum string survives.

Complexity Analysis

The implemented search checks all \(\binom{10}{5}=252\) choices for the inner set, all \(5!=120\) orderings of that set, and \(5\) choices for the starting outer node. That gives

$$252 \cdot 120 \cdot 5 = 151{,}200$$

candidate starts. Each candidate requires only constant-time arithmetic on five lines, a small membership test on five outer values, and the construction of a short string. For this fixed problem size, the search is effectively instantaneous.

Memory usage is \(O(1)\) apart from tiny temporary containers. The key reason the brute force is practical is that the equal-sum equations collapse the outer ring: the code never needs to permute all ten positions freely.

Footnotes and References

  1. Problem page: Project Euler 68 - Magic 5-gon Ring
  2. Permutations: Wikipedia - Permutation
  3. Combinations: Wikipedia - Combination
  4. Circular arrangements: Wikipedia - Circular permutation
  5. Lexicographic order: Wikipedia - Lexicographical order

Problemzusammenfassung

Ein magischer 5-Eck-Ring verwendet die Zahlen \(1\) bis \(10\) jeweils genau einmal. Fünf Zahlen liegen auf dem inneren Fünfeck, fünf auf dem äußeren. Jede Linie hat die Form \((o_k,i_k,i_{k+1})\): ein äußerer Knoten ist mit zwei benachbarten inneren Knoten verbunden, und alle fünf Linien müssen dieselbe Summe besitzen.

Codiert wird ein Ring, indem man die fünf Dreiergruppen aneinanderhängt, beginnend bei der Linie mit dem numerisch kleinsten äußeren Knoten und dann im Uhrzeigersinn. Gesucht ist also nicht nur irgendein magischer Ring, sondern die größtmögliche 16-stellige Zeichenkette unter genau dieser kanonischen Leseregel.

Mathematischer Ansatz

Bezeichne die innere zyklische Reihenfolge mit \(i_1,i_2,i_3,i_4,i_5\) und die äußeren Knoten mit \(o_1,o_2,o_3,o_4,o_5\). Dann lautet die magische Bedingung

$$o_1+i_1+i_2=o_2+i_2+i_3=o_3+i_3+i_4=o_4+i_4+i_5=o_5+i_5+i_1=S.$$

Die Lösung stützt sich im Wesentlichen auf diese fünf Gleichungen, auf eine globale Summeninvariante und auf die besondere Rolle der Zahl \(10\) in der Länge der Enddarstellung.

Den Außenring aus einer geordneten Innenreihenfolge ableiten

Sobald die zyklische Reihenfolge der inneren Zahlen feststeht, bestimmt ein einziger äußerer Knoten bereits die gemeinsame Liniensumme. Beginnt man mit \(o_1\), so gilt

$$S=o_1+i_1+i_2.$$

Damit sind alle weiteren Außenknoten erzwungen:

$$o_2=S-i_2-i_3,\quad o_3=S-i_3-i_4,\quad o_4=S-i_4-i_5,\quad o_5=S-i_5-i_1.$$

Ein Kandidat ist also genau dann gültig, wenn diese fünf abgeleiteten Außenwerte genau die fünf Zahlen sind, die im Innenring nicht verwendet wurden. Dadurch schrumpft der Suchraum drastisch: Man muss die zehn Positionen nicht unabhängig voneinander permutieren.

Die globale Summeninvariante

Jeder Außenknoten kommt in genau einer Linie vor, jeder Innenknoten in genau zwei. Summiert man alle fünf Liniensummen, erhält man

$$5S=(o_1+o_2+o_3+o_4+o_5)+2(i_1+i_2+i_3+i_4+i_5).$$

Da die Zahlen \(1\) bis \(10\) zusammen \(55\) ergeben, ist bei \(I=i_1+i_2+i_3+i_4+i_5\) die Außensumme gleich \(55-I\). Also folgt

$$5S=(55-I)+2I=55+I.$$

Damit muss \(I\) durch \(5\) teilbar sein, und sobald die Innenmenge feststeht, ist auch die gemeinsame Liniensumme festgelegt:

$$S=\frac{55+I}{5}.$$

Diese Bedingung löst die Anordnung noch nicht allein, aber sie schließt viele Mengen von vornherein aus.

Warum eine 16-stellige Darstellung \(10\) außen erzwingt

In der verketteten Darstellung erscheint jede äußere Zahl genau einmal und jede innere Zahl genau zweimal, weil jeder innere Knoten zu zwei benachbarten Linien gehört. Wären alle Zahlen einstellig, hätte die Zeichenkette \(15\) Stellen. Die einzige zusätzliche Stelle kommt von der Zahl \(10\).

Liegt \(10\) außen, erscheint sie einmal und die Gesamtlänge ist \(15+1=16\). Liegt \(10\) innen, erscheint sie zweimal und die Gesamtlänge ist \(15+2=17\). Also muss jede gültige 16-stellige Lösung die \(10\) auf dem Außenring platzieren.

Kanonische Reihenfolge und lexikographischer Druck

Die Leseregel beginnt beim kleinsten Außenknoten. Dadurch wird die Rotationssymmetrie gebrochen: Geometrisch kann derselbe Ring in fünf Rotationen dargestellt werden, aber nur eine davon ist als Zeichenkette zulässig.

Für das Maximum ist das entscheidend. Der erste Ziffernblock beginnt mit dem kleinsten Außenknoten; deshalb sollte dieser so groß wie möglich sein. Da \(10\) ohnehin außen liegen muss, ist die beste mögliche Außenmenge \(\{6,7,8,9,10\}\), deren Minimum \(6\) ist. Dann bleibt innen zwangsläufig \(\{1,2,3,4,5\}\), und es gilt

$$S=\frac{55+(1+2+3+4+5)}{5}=\frac{70}{5}=14.$$

Die vollständige Suche in den Implementierungen bestätigt, dass die maximale 16-stellige Zeichenkette tatsächlich aus genau dieser stärksten Kandidatenfamilie stammt.

Durchgerechnetes Beispiel: der optimale Ring

Wähle die innere Reihenfolge im Uhrzeigersinn als

$$ (i_1,i_2,i_3,i_4,i_5)=(5,3,1,4,2). $$

Mit \(S=14\) sind die Außenknoten dann erzwungen:

$$o_1=14-5-3=6,\quad o_2=14-3-1=10,\quad o_3=14-1-4=9,\quad o_4=14-4-2=8,\quad o_5=14-2-5=7.$$

Die fünf Linien lauten also

$$ (6,5,3),\ (10,3,1),\ (9,1,4),\ (8,4,2),\ (7,2,5), $$

und alle summieren sich zu \(14\). Die kanonische Verkettung ist daher

$$6531031914842725,$$

genau die maximale 16-stellige Zeichenkette der Aufgabe.

Wie der Code arbeitet

Die Implementierungen in C++, Python und Java verwenden eine direkte Enumeration, aber nur über die mathematisch relevanten Freiheitsgrade. Zuerst wird \(\{1,\dots,10\}\) in eine Innenmenge mit fünf Zahlen und deren äußeres Komplement zerlegt. Danach wird jede Reihenfolge des Innenzyklus ausprobiert, ein möglicher Start-Außenknoten gewählt und der restliche Außenring über die Gleichungen mit gemeinsamer Summe automatisch berechnet.

Die Programme kodieren nicht jede theoretische Kürzung explizit vor. Weder wird vorab auf „\(10\) muss außen liegen“ gefiltert noch auf „die Innensumme muss durch \(5\) teilbar sein“. Stattdessen bleibt der Code bewusst einfach: Er erzeugt einen Kandidaten, leitet daraus die Außenwerte ab und verwirft alles, was nicht exakt die fünf unbenutzten Zahlen ergibt.

Anschließend wird die kanonische Leseregel umgesetzt, indem der gewählte Start-Außenknoten zugleich der kleinste Außenknoten sein muss. So verschwinden Rotationsduplikate. Dann werden die fünf Dreiergruppen im Uhrzeigersinn verkettet. Hat die resultierende Zeichenkette Länge \(16\) und ist lexikographisch größer als das bisherige Optimum, wird sie übernommen. Spiegelbilder tauchen über andere Innenreihenfolgen weiterhin auf, sind aber unschädlich, weil nur das Maximum gespeichert wird.

Komplexitätsanalyse

Die konkrete Suche durchläuft alle \(\binom{10}{5}=252\) Innenmengen, alle \(5!=120\) Anordnungen dieser Menge und \(5\) mögliche Start-Außenknoten. Insgesamt sind das

$$252 \cdot 120 \cdot 5 = 151{,}200$$

Kandidatenstarts. Für jeden davon fallen nur konstante Arbeitsschritte an: einige Additionen und Subtraktionen, ein sehr kleiner Mitgliedschaftstest auf fünf Außenwerten und der Aufbau einer kurzen Zeichenkette. Für Problem 68 ist das praktisch sofort erledigt.

Der Speicherbedarf ist \(O(1)\), abgesehen von winzigen temporären Containern. Dass Brute Force hier funktioniert, liegt daran, dass die Gleichungen mit gemeinsamer Summe den Außenring fast vollständig erzwingen.

Fußnoten und Referenzen

  1. Problemseite: Project Euler 68 - Magic 5-gon Ring
  2. Permutationen: Wikipedia - Permutation
  3. Kombinationen: Wikipedia - Combination
  4. Kreisförmige Anordnungen: Wikipedia - Circular permutation
  5. Lexikographische Ordnung: Wikipedia - Lexicographical order

Problem Özeti

Sihirli 5-gen halkasında \(1\) ile \(10\) arasındaki sayılar tam birer kez kullanılır. Beş sayı iç halkada, beş sayı dış halkada yer alır. Her doğru parçası \((o_k,i_k,i_{k+1})\) biçimindedir; yani bir dış düğüm iki komşu iç düğüme bağlanır ve bu beş doğrunun toplamı aynı olmalıdır.

Bir halka, en küçük dış düğümü içeren satırdan başlanıp saat yönünde ilerlenerek okunan beş üçlünün birleştirilmesiyle temsil edilir. Dolayısıyla amaç yalnızca geçerli bir sihirli halka bulmak değil, bu kanonik okuma kuralına göre mümkün olan en büyük 16 basamaklı diziyi bulmaktır.

Matematiksel Yaklaşım

İç çevrimi \(i_1,i_2,i_3,i_4,i_5\), dış düğümleri de \(o_1,o_2,o_3,o_4,o_5\) ile gösterelim. O zaman sihirli olma koşulu

$$o_1+i_1+i_2=o_2+i_2+i_3=o_3+i_3+i_4=o_4+i_4+i_5=o_5+i_5+i_1=S$$

şeklindedir. Bütün çözüm bu beş eşitliğin, küresel toplam değişmezinin ve \(10\) sayısının dize uzunluğundaki özel rolünün etrafında kuruludur.

Sıralı iç çevrimden dış halkayı türetmek

İç halkadaki döngüsel sıra belirlendiğinde, tek bir dış düğüm ortak satır toplamını belirlemeye yeter. Eğer başlangıç olarak \(o_1\) seçilirse

$$S=o_1+i_1+i_2$$

olur. Geri kalan dış düğümler zorunlu olarak

$$o_2=S-i_2-i_3,\quad o_3=S-i_3-i_4,\quad o_4=S-i_4-i_5,\quad o_5=S-i_5-i_1$$

şeklinde çıkar. Yani bir aday ancak ve ancak bu beş türetilmiş değer, iç halkada kullanılmayan beş sayının tam kendisiyse geçerlidir. Asıl sadeleştirme budur: on konumu bağımsız biçimde permüte etmeye gerek kalmaz.

Toplam değişmezi

Her dış düğüm yalnızca bir satırda, her iç düğüm ise iki satırda görünür. Bu yüzden beş satırın toplamı

$$5S=(o_1+o_2+o_3+o_4+o_5)+2(i_1+i_2+i_3+i_4+i_5)$$

olur. \(1\) ile \(10\) arasındaki sayıların toplamı \(55\) olduğundan, \(I=i_1+i_2+i_3+i_4+i_5\) dersek dış toplam \(55-I\) olur ve

$$5S=(55-I)+2I=55+I$$

elde edilir. Buradan \(I\)'nin \(5\) ile bölünebilir olması gerektiği çıkar. Ayrıca iç küme bilindiğinde ortak toplam da sabitlenir:

$$S=\frac{55+I}{5}.$$

Bu tek başına düzeni vermez, fakat hangi iç kümelerin olası olabileceğini ciddi biçimde sınırlar.

Neden 16 basamak için \(10\) dış halkada olmak zorundadır

Birleştirilmiş gösterimde her dış sayı bir kez, her iç sayı iki kez görünür; çünkü her iç düğüm iki komşu satırın parçasıdır. Tüm sayılar tek basamaklı olsaydı toplam uzunluk \(15\) olurdu. Ekstra basamak yalnızca \(10\) sayısından gelir.

\(10\) dış halkadaysa gösterimde bir kez görünür ve toplam uzunluk \(15+1=16\) olur. \(10\) iç halkadaysa iki kez görünür ve uzunluk \(15+2=17\) olur. Demek ki geçerli her 16 basamaklı adayda \(10\) mutlaka dış halkada yer almak zorundadır.

Kanonik sıralama ve sözlükbilimsel baskı

Okuma kuralı en küçük dış düğümden başlar. Bu tercih dönme simetrisini kırar: aynı halka geometrik olarak beş farklı dönüşle yazılabilir, fakat dize gösteriminde bunlardan yalnızca biri kabul edilir.

Maksimizasyon açısından bu daha da önemlidir. İlk blok en küçük dış düğümle başladığı için, bu değerin mümkün olduğunca büyük olması istenir. \(10\) zaten dışarıda olmak zorunda olduğundan, mümkün olan en iyi dış küme \(\{6,7,8,9,10\}\) olur; bunun en küçüğü \(6\)'dır. O durumda iç küme zorunlu olarak \(\{1,2,3,4,5\}\) olur ve

$$S=\frac{55+(1+2+3+4+5)}{5}=\frac{70}{5}=14$$

çıkar. Uygulamaların yaptığı tam arama da en büyük 16 basamaklı dizinin gerçekten bu en güçlü aday ailesinden geldiğini doğrular.

Çalışılmış örnek: en iyi halka

İç çevrimi saat yönünde

$$ (i_1,i_2,i_3,i_4,i_5)=(5,3,1,4,2) $$

olarak alalım. \(S=14\) için dış düğümler zorunlu olarak

$$o_1=14-5-3=6,\quad o_2=14-3-1=10,\quad o_3=14-1-4=9,\quad o_4=14-4-2=8,\quad o_5=14-2-5=7$$

olur. Böylece beş satır

$$ (6,5,3),\ (10,3,1),\ (9,1,4),\ (8,4,2),\ (7,2,5) $$

şeklindedir ve hepsinin toplamı \(14\)'tür. Kanonik birleştirme de

$$6531031914842725$$

olur; bu değer aramanın döndürdüğü en büyük 16 basamaklı dizidir.

Kod Nasıl Çalışır

C++, Python ve Java uygulamaları doğrudan arama yapar, fakat yalnızca matematiksel olarak anlamlı serbestlikler üzerinde dolaşır. Önce \(\{1,\dots,10\}\) kümesini beş elemanlı bir iç küme ve onun dıştaki tümleyeni olarak ayırırlar. Sonra iç çevrimin her sırasını dener, başlangıç dış düğümü için bir aday seçer ve ortak toplam denklemlerinden öteki dört dış değeri otomatik olarak üretirler.

Uygulamalar her teorik kırpmayı baştan kodlamaz. Örneğin “\(10\) dışarıda olmalı” ya da “iç toplam \(5\)'e bölünmeli” gibi filtreler önceden uygulanmaz. Bunun yerine yöntem bilinçli olarak sade tutulur: aday oluşturulur, ima edilen dış halka hesaplanır ve türetilen çokluk kullanılmayan beş sayıyla tam örtüşmüyorsa aday elenir.

Bundan sonra kanonik okuma kuralı uygulanır: seçilen ilk dış düğüm, beş dış düğümün en küçüğü olmak zorundadır. Böylece dönme kopyaları silinir. Sonra beş üçlü saat yönünde birleştirilir. Elde edilen dize \(16\) basamaklıysa ve mevcut en iyi değerden sözlükbilimsel olarak büyükse yeni cevap olur. Ters yönlü aynalar farklı iç sıralar üzerinden yine görülebilir, fakat yalnızca maksimum saklandığı için bu zararsızdır.

Karmaşıklık Analizi

Gerçekleştirilen arama tüm \(\binom{10}{5}=252\) iç kümesini, bu kümenin tüm \(5!=120\) sıralarını ve \(5\) başlangıç dış düğümü seçimini dener. Toplam aday başlangıç sayısı

$$252 \cdot 120 \cdot 5 = 151{,}200$$

olur. Her aday için yalnızca sabit sayıda toplama-çıkarma işlemi, beş elemanlı küçük bir üyelik denetimi ve kısa bir dize oluşturma maliyeti vardır. Problem 68 için bu pratikte anlıktır.

Bellek kullanımı, küçük geçici yapılar dışında \(O(1)\)'dir. Kaba kuvvetin burada işe yaramasının nedeni, ortak toplam denklemlerinin dış halkayı neredeyse tamamen belirlemesidir.

Dipnotlar ve Kaynaklar

  1. Problem sayfası: Project Euler 68 - Magic 5-gon Ring
  2. Permütasyonlar: Wikipedia - Permutation
  3. Kombinasyonlar: Wikipedia - Combination
  4. Dairesel düzenler: Wikipedia - Circular permutation
  5. Leksikografik sıra: Wikipedia - Lexicographical order

Resumen del Problema

Un anillo mágico de 5 lados usa los números del \(1\) al \(10\) exactamente una vez. Cinco números quedan en el pentágono interior y cinco en el exterior. Cada línea tiene la forma \((o_k,i_k,i_{k+1})\): un nodo exterior unido a dos nodos interiores consecutivos, y las cinco líneas deben tener la misma suma.

El anillo se codifica concatenando los cinco tríos, empezando por la línea cuyo nodo exterior es numéricamente el menor y continuando en sentido horario. Por tanto, el objetivo no es solo hallar un anillo mágico válido, sino obtener la mayor cadena posible de 16 dígitos bajo esa regla canónica de lectura.

Enfoque Matemático

Denotemos el ciclo interior por \(i_1,i_2,i_3,i_4,i_5\) y los nodos exteriores por \(o_1,o_2,o_3,o_4,o_5\). La condición mágica es entonces

$$o_1+i_1+i_2=o_2+i_2+i_3=o_3+i_3+i_4=o_4+i_4+i_5=o_5+i_5+i_1=S.$$

Toda la solución gira alrededor de estas ecuaciones, de una identidad global de suma y del papel especial del número \(10\) en la longitud final de la representación.

Derivar el anillo exterior a partir de un ciclo interior ordenado

Una vez fijado el orden circular del interior, elegir un solo nodo exterior ya fija la suma común. Si empezamos por \(o_1\), entonces

$$S=o_1+i_1+i_2.$$

Los demás nodos exteriores quedan forzados:

$$o_2=S-i_2-i_3,\quad o_3=S-i_3-i_4,\quad o_4=S-i_4-i_5,\quad o_5=S-i_5-i_1.$$

Así, un candidato es válido exactamente cuando esos cinco valores derivados son los cinco números que no se usaron en el interior, sin repeticiones ni faltantes. Esa es la gran reducción estructural: no hace falta permutar libremente las diez posiciones.

La invariante de suma total

Cada nodo exterior aparece en una sola línea, mientras que cada nodo interior aparece en dos. Al sumar las cinco líneas se obtiene

$$5S=(o_1+o_2+o_3+o_4+o_5)+2(i_1+i_2+i_3+i_4+i_5).$$

Como la suma de \(1,2,\dots,10\) es \(55\), si \(I=i_1+i_2+i_3+i_4+i_5\), entonces la suma exterior vale \(55-I\), y por tanto

$$5S=(55-I)+2I=55+I.$$

De aquí se deduce que \(I\) debe ser divisible por \(5\), y que una vez conocido el conjunto interior la suma común queda determinada por

$$S=\frac{55+I}{5}.$$

Esto todavía no determina el orden, pero sí elimina muchas elecciones imposibles antes de mirar la geometría fina.

Por qué una solución de 16 dígitos obliga a poner \(10\) fuera

En la representación concatenada, cada número exterior aparece una vez y cada número interior aparece dos veces, porque cada nodo interior pertenece a dos líneas vecinas. Si todos fueran de una cifra, la cadena tendría \(15\) dígitos. El único dígito extra lo aporta el número \(10\).

Si \(10\) está en el anillo exterior, aparece una sola vez y la longitud total es \(15+1=16\). Si \(10\) está en el interior, aparece dos veces y la longitud pasa a ser \(15+2=17\). Por tanto, toda solución válida de 16 dígitos debe situar el \(10\) en el anillo exterior.

Orden canónico y presión lexicográfica

La regla de lectura empieza por el menor nodo exterior. Eso rompe la simetría de rotación: geométricamente el mismo anillo puede girarse de cinco maneras, pero solo una de ellas produce la representación permitida.

Además, esto influye directamente en la maximización. El primer bloque de la cadena empieza con el menor exterior, así que conviene que ese valor sea lo más grande posible. Como \(10\) ya debe estar fuera, el mejor conjunto exterior posible es \(\{6,7,8,9,10\}\), cuyo mínimo es \(6\). Eso obliga a que el interior sea \(\{1,2,3,4,5\}\), y entonces

$$S=\frac{55+(1+2+3+4+5)}{5}=\frac{70}{5}=14.$$

La búsqueda exhaustiva de las implementaciones confirma que la máxima cadena de 16 dígitos aparece precisamente dentro de esta familia de candidatos.

Ejemplo trabajado: el anillo óptimo

Tomemos el ciclo interior en sentido horario como

$$ (i_1,i_2,i_3,i_4,i_5)=(5,3,1,4,2). $$

Con \(S=14\), los nodos exteriores quedan forzados a ser

$$o_1=14-5-3=6,\quad o_2=14-3-1=10,\quad o_3=14-1-4=9,\quad o_4=14-4-2=8,\quad o_5=14-2-5=7.$$

Las cinco líneas son

$$ (6,5,3),\ (10,3,1),\ (9,1,4),\ (8,4,2),\ (7,2,5), $$

todas con suma \(14\). La concatenación canónica es entonces

$$6531031914842725,$$

que es exactamente la mayor cadena de 16 dígitos del problema.

Cómo Funciona el Código

Las implementaciones en C++, Python y Java hacen una enumeración directa, pero solo sobre los grados de libertad que importan matemáticamente. Dividen \(\{1,\dots,10\}\) en un conjunto interior de cinco elementos y su complemento exterior, prueban todos los órdenes posibles del ciclo interior, eligen un candidato para el primer nodo exterior y dejan que las ecuaciones de suma común determinen automáticamente los otros cuatro exteriores.

El código no incorpora por adelantado todas las podas teóricas. No filtra explícitamente por “\(10\) debe estar fuera” ni por “la suma interior debe ser múltiplo de \(5\)”. En vez de eso, mantiene un flujo simple: genera un candidato, calcula el anillo exterior implícito y lo descarta salvo que el multiconjunto obtenido coincida exactamente con los números no usados.

Después aplica la regla canónica de lectura exigiendo que el exterior elegido como inicio sea también el menor de los cinco. Eso elimina los duplicados por rotación. Luego concatena los cinco tríos en sentido horario. Si la cadena resultante tiene longitud \(16\) y es lexicográficamente mayor que la mejor actual, pasa a ser la nueva respuesta. Las imágenes especulares todavía aparecen a través de otros órdenes interiores, pero no causan problema porque solo sobrevive la cadena máxima.

Análisis de Complejidad

La búsqueda implementada revisa todas las \(\binom{10}{5}=252\) elecciones del conjunto interior, las \(5!=120\) permutaciones de ese conjunto y \(5\) opciones para el nodo exterior inicial. En total son

$$252 \cdot 120 \cdot 5 = 151{,}200$$

arranques candidatos. Cada uno requiere solo aritmética constante sobre cinco líneas, una comprobación muy pequeña de pertenencia sobre cinco valores exteriores y la construcción de una cadena corta. Para el tamaño fijo de este problema, el tiempo de ejecución es esencialmente instantáneo.

El uso de memoria es \(O(1)\) salvo contenedores temporales diminutos. La razón por la que este barrido exhaustivo funciona es que las ecuaciones del anillo determinan casi todo el exterior una vez fijado el interior ordenado.

Notas y Referencias

  1. Página del problema: Project Euler 68 - Magic 5-gon Ring
  2. Permutaciones: Wikipedia - Permutation
  3. Combinaciones: Wikipedia - Combination
  4. Arreglos circulares: Wikipedia - Circular permutation
  5. Orden lexicográfico: Wikipedia - Lexicographical order

问题概述

魔法 5-gon 环把数字 \(1\) 到 \(10\) 各用一次。五个数字放在内环,五个数字放在外环。每一条线都形如 \((o_k,i_k,i_{k+1})\),也就是一个外点连着两个相邻的内点,并且这五条线的和都必须相同。

题目规定的表示方法不是任意写法,而是从外环中数值最小的那条线开始,按顺时针方向把五个三元组依次拼接起来。因此要解决的问题不是“找一个可行环”这么简单,而是要在这个规范化读法下找出最大的 16 位字符串。

数学方法

把内环的顺时针次序记作 \(i_1,i_2,i_3,i_4,i_5\),把外环记作 \(o_1,o_2,o_3,o_4,o_5\)。那么魔法条件就是

$$o_1+i_1+i_2=o_2+i_2+i_3=o_3+i_3+i_4=o_4+i_4+i_5=o_5+i_5+i_1=S.$$

整道题的核心就在于这组方程、一个全局求和不变量,以及数字 \(10\) 在最终字符串长度中的特殊地位。

固定内环顺序后,外环其实是被推出来的

一旦内环的循环顺序固定,再选定一个起始外点,共同的线和 \(S\) 就确定了。如果起点取为 \(o_1\),那么

$$S=o_1+i_1+i_2.$$

其余四个外点就不再自由,而是被方程强制为

$$o_2=S-i_2-i_3,\quad o_3=S-i_3-i_4,\quad o_4=S-i_4-i_5,\quad o_5=S-i_5-i_1.$$

所以一个候选环是否有效,等价于检查这五个推导出的外点是不是恰好等于“没有放在内环上的那五个数”,而且没有重复、没有缺失。这一点极大压缩了搜索空间,因为我们不需要对十个位置做完全独立的全排列。

全局求和不变量

每个外点只出现在一条线上,而每个内点会出现在两条相邻的线上。把五条线全部加起来,就有

$$5S=(o_1+o_2+o_3+o_4+o_5)+2(i_1+i_2+i_3+i_4+i_5).$$

由于 \(1,2,\dots,10\) 的总和是 \(55\),如果记内环和为 \(I=i_1+i_2+i_3+i_4+i_5\),那么外环和就是 \(55-I\)。于是得到

$$5S=(55-I)+2I=55+I.$$

这说明 \(I\) 必须能被 \(5\) 整除,而且一旦内环的五个数字定下来,公共线和也就被唯一确定:

$$S=\frac{55+I}{5}.$$

这个条件还不能直接决定顺序,但它已经把很多不可能的内环集合提前排除了。

为什么 16 位字符串一定要求 \(10\) 在外环

在最终拼接出来的字符串里,每个外环数字只出现一次,而每个内环数字会出现两次,因为每个内点属于两条边。如果所有数字都只有一位,那么总长度会是 \(15\) 位。唯一会额外贡献位数的只有数字 \(10\)。

如果 \(10\) 在外环,它在字符串里只出现一次,总长度就是 \(15+1=16\)。如果 \(10\) 在内环,它会出现两次,总长度就变成 \(15+2=17\)。因此,所有合法的 16 位候选都必须把 \(10\) 放在外环。

规范化读法与字典序最大化

题目要求从最小的外点开始读,这一步本身就消除了旋转歧义。同一个几何环可以旋转出五种写法,但只有从最小外点开始的那一种会被接受为标准表示。

这条规则也直接影响最大化。因为字符串开头的第一个数字块就是从最小外点开始,所以要让整个字符串尽量大,最小外点本身就应该尽可能大。既然 \(10\) 必须在外环,那么外环最有利的选择就是 \(\{6,7,8,9,10\}\),它的最小值已经达到可行上界 \(6\)。这时内环只能是 \(\{1,2,3,4,5\}\),并且

$$S=\frac{55+(1+2+3+4+5)}{5}=\frac{70}{5}=14.$$

三个实现做的穷举搜索进一步确认:最大的 16 位答案确实就来自这一组最强候选。

完整例子:最优环如何被推出

取内环顺时针顺序为

$$ (i_1,i_2,i_3,i_4,i_5)=(5,3,1,4,2). $$

在 \(S=14\) 的条件下,外环被唯一推出为

$$o_1=14-5-3=6,\quad o_2=14-3-1=10,\quad o_3=14-1-4=9,\quad o_4=14-4-2=8,\quad o_5=14-2-5=7.$$

于是五条线就是

$$ (6,5,3),\ (10,3,1),\ (9,1,4),\ (8,4,2),\ (7,2,5), $$

每条线的和都等于 \(14\)。按题目规定的顺序拼接,得到

$$6531031914842725,$$

这正是搜索返回的最大 16 位字符串。

代码如何工作

C++、Python 和 Java 的实现都采用直接枚举,但它们枚举的是数学上真正自由的部分。程序先把 \(\{1,\dots,10\}\) 拆成一个 5 元内环集合和它的外环补集,再尝试内环的所有顺序,挑一个起始外点,然后由等和方程自动推导出剩下四个外点。

实现并没有把所有理论剪枝都硬编码进去。比如它不会先显式过滤“\(10\) 必须在外环”或者“内环和必须是 \(5\) 的倍数”。相反,程序保持了一个很干净的流程:生成候选,计算它所隐含的外环,如果推导出的五个外点不能与未使用的五个数字完全一致,就立即丢弃。

之后,程序用“起始外点必须是五个外点中最小的”来落实规范化读法,这样就去掉了旋转重复。然后顺时针拼接五个三元组。如果得到的字符串长度是 \(16\),并且按字典序大于当前最优值,就更新答案。镜像方向仍会通过不同的内环顺序出现,但这没有问题,因为程序只保留全局最大的那个字符串。

复杂度分析

实现层面的搜索会检查全部 \(\binom{10}{5}=252\) 个内环集合、每个集合的 \(5!=120\) 种顺序,以及 \(5\) 种起始外点选择。因此候选起点总数是

$$252 \cdot 120 \cdot 5 = 151{,}200.$$

每个候选只需要做常数次加减法、一次规模为 5 的小型集合校验,以及构造一个很短的字符串。对于这个固定规模的问题,运行时间基本可以看成瞬时完成。

除了少量临时容器外,空间使用是 \(O(1)\)。之所以这种穷举在这里完全可行,关键就在于等和方程把外环的大部分自由度都消掉了。

注释与参考资料

  1. 题目页面:Project Euler 68 - Magic 5-gon Ring
  2. 排列:Wikipedia - Permutation
  3. 组合:Wikipedia - Combination
  4. 圆排列:Wikipedia - Circular permutation
  5. 字典序:Wikipedia - Lexicographical order

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

В магическом 5-угольном кольце числа от \(1\) до \(10\) используются ровно по одному разу. Пять чисел стоят на внутреннем пятиугольнике, еще пять на внешнем. Каждая линия имеет вид \((o_k,i_k,i_{k+1})\): внешний узел соединен с двумя соседними внутренними, и суммы всех пяти линий должны совпадать.

Кольцо кодируется конкатенацией пяти троек, начиная с линии, чей внешний узел наименьший по значению, а затем по часовой стрелке. Значит, нужно не просто найти допустимую магическую конфигурацию, а получить максимально возможную 16-значную строку в этой канонической записи.

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

Обозначим внутренний цикл через \(i_1,i_2,i_3,i_4,i_5\), а внешние узлы через \(o_1,o_2,o_3,o_4,o_5\). Тогда условие магичности записывается так:

$$o_1+i_1+i_2=o_2+i_2+i_3=o_3+i_3+i_4=o_4+i_4+i_5=o_5+i_5+i_1=S.$$

Вся задача держится на этих уравнениях, на одном суммарном инварианте и на том, как число \(10\) влияет на длину итоговой строки.

Как внешний цикл выводится из упорядоченного внутреннего

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

$$S=o_1+i_1+i_2.$$

Остальные внешние значения тогда определяются однозначно:

$$o_2=S-i_2-i_3,\quad o_3=S-i_3-i_4,\quad o_4=S-i_4-i_5,\quad o_5=S-i_5-i_1.$$

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

Глобальный инвариант суммы

Каждый внешний узел встречается ровно в одной линии, а каждый внутренний ровно в двух. Поэтому сумма всех пяти линий равна

$$5S=(o_1+o_2+o_3+o_4+o_5)+2(i_1+i_2+i_3+i_4+i_5).$$

Так как сумма чисел \(1,2,\dots,10\) равна \(55\), обозначив \(I=i_1+i_2+i_3+i_4+i_5\), получаем внешнюю сумму \(55-I\), а значит

$$5S=(55-I)+2I=55+I.$$

Отсюда сразу видно, что \(I\) должен делиться на \(5\), а после выбора внутреннего множества общая сумма линий уже фиксирована:

$$S=\frac{55+I}{5}.$$

Это еще не задает сам порядок, но существенно сокращает число потенциально возможных наборов.

Почему 16-значная запись требует, чтобы \(10\) стояло снаружи

В окончательной строке каждое внешнее число появляется один раз, а каждое внутреннее дважды, потому что внутренний узел принадлежит двум соседним линиям. Если бы все числа были однозначными, длина записи была бы равна \(15\). Дополнительная цифра возникает только из-за числа \(10\).

Если \(10\) находится на внешнем кольце, оно встречается один раз, и общая длина равна \(15+1=16\). Если \(10\) находится на внутреннем кольце, оно встречается дважды, и длина становится \(15+2=17\). Значит, всякая допустимая 16-значная конфигурация обязана помещать \(10\) на внешнее кольцо.

Канонический порядок и лексикографический максимум

Правило чтения начинается с наименьшего внешнего узла. Тем самым устраняется неоднозначность вращения: геометрически один и тот же ring можно повернуть пятью способами, но строковое представление разрешает только один старт.

Это же влияет и на максимум. Первая часть строки начинается именно с минимального внешнего узла, значит, чтобы вся строка была как можно больше, этот минимум должен быть максимально большим. Поскольку \(10\) уже обязано быть снаружи, наилучшее внешнее множество равно \(\{6,7,8,9,10\}\), и его минимум равен \(6\). Тогда внутреннее множество вынужденно равно \(\{1,2,3,4,5\}\), а

$$S=\frac{55+(1+2+3+4+5)}{5}=\frac{70}{5}=14.$$

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

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

Возьмем внутренний цикл по часовой стрелке

$$ (i_1,i_2,i_3,i_4,i_5)=(5,3,1,4,2). $$

При \(S=14\) внешние узлы однозначно вычисляются так:

$$o_1=14-5-3=6,\quad o_2=14-3-1=10,\quad o_3=14-1-4=9,\quad o_4=14-4-2=8,\quad o_5=14-2-5=7.$$

Получаются пять линий

$$ (6,5,3),\ (10,3,1),\ (9,1,4),\ (8,4,2),\ (7,2,5), $$

каждая с суммой \(14\). Каноническая конкатенация дает

$$6531031914842725,$$

то есть именно ту максимальную 16-значную строку, которую и возвращает программа.

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

Реализации на C++, Python и Java выполняют прямой перебор, но только по действительно важным степеням свободы. Сначала множество \(\{1,\dots,10\}\) разбивается на внутреннюю пятерку и внешний дополняющий набор. Затем перебирается каждый порядок внутреннего цикла, выбирается один кандидат на стартовый внешний узел, а остальные четыре внешних значения выводятся автоматически из уравнений равных сумм.

Код не встраивает все теоретические сокращения заранее. Он не фильтрует отдельно случаи вида «\(10\) должно быть снаружи» или «внутренняя сумма должна делиться на \(5\)». Вместо этого схема остается простой: строится кандидат, вычисляется внешний цикл, и все отбрасывается, если полученный набор внешних чисел не совпадает в точности с неиспользованными числами.

Далее реализуется каноническое правило чтения: выбранный первый внешний узел обязан быть минимальным среди всех пяти внешних. Это убирает повторения из-за вращений. Потом пять троек конкатенируются по часовой стрелке. Если длина строки равна \(16\) и строка лексикографически больше текущего лучшего результата, ответ обновляется. Зеркальные варианты все еще встречаются через другие порядки внутреннего цикла, но это не мешает, потому что сохраняется только глобальный максимум.

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

В реализации перебираются все \(\binom{10}{5}=252\) варианта внутреннего множества, все \(5!=120\) порядка внутри него и \(5\) варианта стартового внешнего узла. Итого получается

$$252 \cdot 120 \cdot 5 = 151{,}200$$

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

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

Сноски и ссылки

  1. Страница задачи: Project Euler 68 - Magic 5-gon Ring
  2. Перестановки: Wikipedia - Permutation
  3. Сочетания: Wikipedia - Combination
  4. Круговые перестановки: Wikipedia - Circular permutation
  5. Лексикографический порядок: Wikipedia - Lexicographical order

ملخص المسألة

في الحلقة السحرية ذات الخمسة أضلاع تُستعمل الأعداد من \(1\) إلى \(10\) مرة واحدة لكل عدد. توضع خمسة أعداد على الحلقة الداخلية وخمسة على الحلقة الخارجية. كل خط له الصورة \((o_k,i_k,i_{k+1})\)، أي عقدة خارجية متصلة بعقدتين داخليتين متجاورتين، ويجب أن تكون مجاميع الخطوط الخمسة متساوية.

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

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

لنرمز إلى ترتيب الحلقة الداخلية بـ \(i_1,i_2,i_3,i_4,i_5\)، وإلى العقد الخارجية بـ \(o_1,o_2,o_3,o_4,o_5\). عندها يصبح شرط السحر

$$o_1+i_1+i_2=o_2+i_2+i_3=o_3+i_3+i_4=o_4+i_4+i_5=o_5+i_5+i_1=S.$$

الحل كله مبني على هذه المعادلات، وعلى ثابت جمع كلي، وعلى حقيقة أن العدد \(10\) يغيّر طول السلسلة النهائية بحسب مكانه.

اشتقاق الحلقة الخارجية من ترتيب داخلي معلوم

إذا ثبت الترتيب الدوري للأعداد الداخلية، فإن اختيار عقدة خارجية واحدة يكفي لتحديد مجموع الخط المشترك. إذا بدأنا بـ \(o_1\)، فإن

$$S=o_1+i_1+i_2.$$

ثم تُفرض باقي العقد الخارجية فرضًا:

$$o_2=S-i_2-i_3,\quad o_3=S-i_3-i_4,\quad o_4=S-i_4-i_5,\quad o_5=S-i_5-i_1.$$

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

ثابت المجموع الكلي

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

$$5S=(o_1+o_2+o_3+o_4+o_5)+2(i_1+i_2+i_3+i_4+i_5).$$

ومادام مجموع الأعداد \(1,2,\dots,10\) يساوي \(55\)، فإذا وضعنا

$$I=i_1+i_2+i_3+i_4+i_5,$$

فإن مجموع الخارج يساوي \(55-I\)، ومن ثم

$$5S=(55-I)+2I=55+I.$$

إذًا يجب أن يكون \(I\) من مضاعفات \(5\)، وحين نعرف مجموعة الداخل يصبح مجموع الخط المشترك محددًا تلقائيًا:

$$S=\frac{55+I}{5}.$$

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

لماذا تفرض سلسلة من 16 رقمًا أن يكون \(10\) في الخارج

في السلسلة المضمومة يظهر كل عدد خارجي مرة واحدة، بينما يظهر كل عدد داخلي مرتين لأن كل عقدة داخلية مشتركة بين خطين متجاورين. لو كانت كل الأعداد أحادية الرقم لكان طول السلسلة \(15\) رقمًا. الرقم الإضافي الوحيد يأتي من العدد \(10\).

إذا كان \(10\) في الحلقة الخارجية فإنه يظهر مرة واحدة فقط، فيصبح الطول \(15+1=16\). أما إذا كان في الحلقة الداخلية فإنه يظهر مرتين، فيصبح الطول \(15+2=17\). لذلك فإن كل حل صحيح بطول 16 رقمًا لا بد أن يضع \(10\) في الحلقة الخارجية.

الترتيب القياسي والضغط المعجمي

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

وهذه القاعدة تؤثر أيضًا في التعظيم. بما أن أول جزء من السلسلة يبدأ بأصغر عدد خارجي، فنحن نريد أن يكون هذا الأصغر كبيرًا قدر الإمكان. ولأن \(10\) يجب أصلًا أن يكون في الخارج، فإن أفضل مجموعة خارجية ممكنة هي \(\{6,7,8,9,10\}\)، وأصغر عنصر فيها هو \(6\). عندئذٍ تُجبَر الحلقة الداخلية على أن تكون \(\{1,2,3,4,5\}\)، ومن ثم

$$S=\frac{55+(1+2+3+4+5)}{5}=\frac{70}{5}=14.$$

والبحث الشامل في التطبيقات يؤكد أن أكبر سلسلة من 16 رقمًا تأتي فعلًا من هذه العائلة الأقوى من المرشحين.

مثال محلول: الحلقة المثلى

لنأخذ الترتيب الداخلي مع اتجاه عقارب الساعة على الصورة

$$ (i_1,i_2,i_3,i_4,i_5)=(5,3,1,4,2). $$

عند \(S=14\) تُفرض العقد الخارجية كما يلي:

$$o_1=14-5-3=6,\quad o_2=14-3-1=10,\quad o_3=14-1-4=9,\quad o_4=14-4-2=8,\quad o_5=14-2-5=7.$$

فتصبح الخطوط الخمسة

$$ (6,5,3),\ (10,3,1),\ (9,1,4),\ (8,4,2),\ (7,2,5), $$

وكلها مجموعها \(14\). أمّا السلسلة القياسية الناتجة فهي

$$6531031914842725,$$

وهي بالضبط أكبر سلسلة من 16 رقمًا تعثر عليها الخوارزمية.

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

تقوم تطبيقات C++ وPython وJava ببحث مباشر، لكنها تبحث فقط في درجات الحرية المهمة رياضيًا. فهي تقسّم \(\{1,\dots,10\}\) إلى مجموعة داخلية من خمسة عناصر ومجموعة خارجية متممة، ثم تجرّب جميع ترتيبات الدورة الداخلية، وتختار مرشحًا للعقدة الخارجية الأولى، وبعد ذلك تشتق العقد الخارجية الأربع الباقية تلقائيًا من معادلات تساوي المجاميع.

الشيفرة لا تفرض مسبقًا كل الاختصارات النظرية. فهي لا تبدأ مثلًا بفلترة الحالات التي لا يكون فيها \(10\) خارجًا، ولا تفحص مسبقًا شرط أن يكون مجموع الداخل من مضاعفات \(5\). بدلًا من ذلك تتبع أسلوبًا بسيطًا وواضحًا: تكوّن مرشحًا، تحسب الحلقة الخارجية المترتبة عليه، ثم ترفضه ما لم تكن القيم الخمس الناتجة مساوية تمامًا للأعداد غير المستخدمة.

بعد ذلك تُطبّق قاعدة القراءة القياسية باشتراط أن تكون العقدة الخارجية المختارة أولًا هي الأصغر بين العقد الخارجية الخمس. هكذا تُزال التكرارات الناتجة عن الدوران. ثم تُضمّ الثلاثيات الخمس مع اتجاه عقارب الساعة. فإذا كانت السلسلة الناتجة بطول \(16\) رقمًا وكانت أكبر معجميًا من أفضل قيمة حالية، تُعتمد جوابًا جديدًا. أما الصور المعكوسة فما زالت تظهر عبر ترتيبات داخلية أخرى، لكنها لا تضر لأن الخوارزمية تحتفظ فقط بأكبر سلسلة نهائية.

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

البحث المطبق يمر على جميع \(\binom{10}{5}=252\) اختيارات الحلقة الداخلية، وعلى جميع \(5!=120\) ترتيبات تلك المجموعة، وعلى \(5\) اختيارات للعقدة الخارجية الابتدائية. أي إن عدد بدايات المرشحين يساوي

$$252 \cdot 120 \cdot 5 = 151{,}200.$$

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

استهلاك الذاكرة هو \(O(1)\) مع تجاهل الحاويات المؤقتة الصغيرة جدًا. والسبب في نجاح هذا البحث الشامل هنا هو أن معادلات التساوي تحدد الحلقة الخارجية تقريبًا بالكامل بمجرد تثبيت ترتيب الداخل.

الحواشي والمراجع

  1. صفحة المسألة: Project Euler 68 - Magic 5-gon Ring
  2. التبديلات: Wikipedia - Permutation
  3. التوافيق: Wikipedia - Combination
  4. الترتيبات الدائرية: Wikipedia - Circular permutation
  5. الترتيب المعجمي: Wikipedia - Lexicographical order