Tüm çift gcd'leri hesaplayarak, kopyaları kaldırarak ve sonra tekrarlayarak bunu nispeten verimli bir şekilde çözmek mümkündür. Etkili hale getiren, tekrarlamadan önce kopyaları kaldırma eylemidir.
Algoritmayı aşağıda daha ayrıntılı olarak açıklayacağım, ancak önce ikili bir operatör tanımlamaya yardımcı olur . Eğer S , T pozitif tamsayılar kümesi tanımlamak vardır⊗S,T
S⊗T={gcd(s,t):s∈S,t∈T}.
Dikkat edin ve | S ⊗ T | ≤ 10 9 (sizin probleminizde); tipik olarak, S ⊗ T algoritması verimli hale yardımcı olan göstermektedir, bu sınırlar iki daha küçük olacaktır. Ayrıca S ⊗ T ile | S | × | T | basit numaralandırma ile gcd işlemleri.|S⊗T|≤|S|×|T||S⊗T|≤109S⊗TS⊗T|S|×|T|
Bu gösterimle, algoritma burada. sayı kümesi girdi olmasına izin verin . Bilgi İşlem G 2 = S 1 ⊗ S 1 , daha sonra S 3 = S 1 ⊗ S 2 , daha sonra S 4 = S 1 ⊗ S 3 , ve böyle devam eder. En küçük Bul k öyle ki 1 ∈ S k ama 1 ∉ S k - 1 . Sonra böyle küçük bir alt kümenin boyutunun k olduğunu biliyorsunuz.S1S2=S1⊗S1S3=S1⊗S2S4=S1⊗S3k1∈Sk1∉Sk−1k. Ayrıca böyle bir alt kümenin somut bir örneğini çıkarmak istiyorsanız, geri işaretçileri tutarak böyle bir seti kolayca yeniden oluşturabilirsiniz.
Bu, ara setlerin hiçbiri üzerinde büyüymediği için nispeten verimli olacaktır (aslında, boyutları muhtemelen bundan daha küçük olacaktır) ve çalışma süresi yaklaşık 500 × ( | S 1 | + | S 2 gerektirir) | + ⋯ ) gcd işlemleri.109500×(|S1|+|S2|+⋯)
İşte verimliliği daha da artırabilecek bir optimizasyon. Temel olarak, tekrarlanan en küçük bulmak için iki katına kullanabilirsiniz öyle ki 1 ∈ S k . Özellikle, her bir x ∈ S i elemanı için , gcd x olan ve boyutu ≤ i olan S 1'in en küçük alt kümesini takip ediyoruz . (Yinelenenleri kaldırdığınızda, bağları daha küçük olan alt küme lehine çözersiniz.) Şimdi, dokuz kümenin sırasını hesaplamak yerine S 1 , S 2 , S 3 , S 4 ,k1∈Skx∈SiS1x≤i , bunun yerine S 2 = S 1 ⊗ S 1 , sonra S 4 = S 2 ⊗ S 2 hesaplayarak S 1 , S 2 , S 4 , S 8 , S 9 beş setin sırasınıhesaplıyoruz, S 8 = S 4 ⊗ S 4 , sonra S 9 = S 1 × S 8S1,S2,S3,S4,…,S9S1,S2,S4,S8,S9S2=S1⊗S1S4=S2⊗S2S8=S4⊗S4S9=S1×S8. Gittiğiniz gibi, ilk bulmak böyle 1 ∈ S k . Eğer bulduktan sonra k öyle ki 1 ∈ S k , hemen durdurabilirsiniz: kimin gcd en küçük alt kümesini bulabilirsiniz 1 ile ilişkili alt kümesi bakarak 1 . Yani, bir dizi ulaşmak en kısa sürede durabilir S k öyle ki 1 ∈ S k , daha küçük bir alt kümesi bulursanız erken durdurmak için olanak sağlayan.k∈[1,2,4,8,9]1∈Skk1∈Sk11Sk1∈Sk
Bu zaman ve alan açısından verimli olmalıdır. Yerden tasarruf etmek için, her bir öğesi için , tüm seti saklamanız gerekmez: iki arka noktası depolamak yeterlidir (böylece gcd'yi aldığınız S i , S j'nin iki öğesi x elde etmek için ) ve isteğe bağlı olarak karşılık gelen alt kümenin boyutu.x∈SkSi,Sjx
Prensip olarak, dizisini başka bir ilave zinciriyle değiştirebilirsiniz . Başka bir ekleme zincirinin daha iyi olup olmayacağını bilmiyorum. Optimal seçimi doğru cevaplar ve kümelerin beklenen boyutlarının dağılımı bağlı olabilir S k bana belli değil, ama muhtemelen deneyler yoluyla ampirik olarak elde edilebilir.[1,2,4,8,9]Sk
Kredi: Her elemanın birlikte sayıların bir alt kümesi depolamak fikrine KWillets için teşekkür ediyorum erken durdurma sağlar.Si