Es ist möglich, dies relativ effizient zu lösen, indem alle paarweisen GCDs berechnet, Duplikate entfernt und dann rekursiv behandelt werden. Es ist der Vorgang des Entfernens von Duplikaten, bevor Sie eine Wiederholung durchführen, die es effizient macht.
Ich werde den Algorithmus im Folgenden näher erläutern , aber zuerst, hilft es , einen binären Operator zu definieren . Wenn S , T Mengen positiver Ganzzahlen sind, definieren Sie⊗S,T
S⊗T={gcd(s,t):s∈S,t∈T}.
Beachten Sie, dass und | S ⊗ T | ≤ 10 9 (in Ihrem Problem); Typischerweise ist S ⊗ T sogar kleiner als eine dieser Grenzen vermuten lässt, was dazu beiträgt, den Algorithmus effizienter zu machen. Beachten Sie auch, dass wir S ⊗ T mit | berechnen können S | × | T | GCD-Operationen durch einfache Aufzählung.|S⊗T|≤|S|×|T||S⊗T|≤109S⊗TS⊗T|S|×|T|
Mit dieser Notation ist hier der Algorithmus. Sei der eingegebene Satz von Zahlen. Berechnen Sie S 2 = S 1 ⊗ S 1 , dann S 3 = S 1 ⊗ S 2 , dann S 4 = S 1 ⊗ S 3 und so weiter. Finden Sie das kleinste k so, dass 1 ∈ S k aber 1 ∉ S k - 1 ist . Dann wissen Sie, dass die Größe der kleinsten solchen Teilmenge k istS1S2=S1⊗S1S3=S1⊗S2S4=S1⊗S3k1∈Sk1∉Sk−1k. Wenn Sie auch ein konkretes Beispiel für eine solche Teilmenge ausgeben möchten, können Sie eine solche Menge leicht rekonstruieren, indem Sie Rückzeiger beibehalten.
Dies ist relativ effizient, da keiner der Zwischensätze eine Größe über (tatsächlich wird ihre Größe wahrscheinlich viel kleiner als diese sein) und die Laufzeit etwa 500 × ( | S 1 | + | S 2) erfordert | + ⋯ ) gcd-Operationen.109500×(|S1|+|S2|+⋯)
Hier ist eine Optimierung, die die Effizienz noch weiter verbessern könnte. Grundsätzlich können Sie iteriertes Verdoppeln verwenden, um das kleinste so zu finden, dass 1 ∈ S k . Insbesondere verfolgen wir für jedes Element x ∈ S i die kleinste Teilmenge von S 1, deren gcd x ist und deren Größe ≤ i ist . (Wenn Sie Duplikate entfernen, lösen Sie Bindungen zugunsten der Teilmenge auf, die kleiner ist.) Anstatt nun die Folge von neun Mengen S 1 , S 2 , S 3 , S 4 , zu berechnen ,k1∈Skx∈SiS1x≤i , wir stattdessen die Sequenz der fünf Sätze berechnen S 1 , S 2 , S 4 , S 8 , S 9 , durch Berechnen von S 2 = S 1 ⊗ S 1 , dann S 4 = S 2 ⊗ S 2 , dann S 8 = S 4 ⊗ S 4 , dann S 9 = S 1 × S 8S1,S2,S3,S4,…,S9S1,S2,S4,S8,S9S2=S1⊗S1S4=S2⊗S2S8=S4⊗S4S9=S1×S8. Finden Sie dabei das erste so dass 1 ∈ S k . Sobald Sie k so gefunden haben, dass 1 ∈ S k ist , können Sie sofort aufhören: Sie können die kleinste Teilmenge finden, deren gcd 1 ist, indem Sie sich die mit 1 verknüpfte Teilmenge ansehen . Sie können also anhalten, sobald Sie eine Menge S k erreichen, so dass 1 ∈ S k , wodurch Sie vorzeitig anhalten können, wenn Sie eine kleinere Teilmenge finden.k∈[1,2,4,8,9]1∈Skk1∈Sk11Sk1∈Sk
x∈SkSi,Sjx
[1,2,4,8,9]Sk
Si