Modüler güç kulelerini değerlendirin


13

İki n ve m sayısı verildiğinde, sonsuz güç kulesini değerlendirin:

n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m

^ Öğesinin doğru ilişkilendirici olduğunu unutmayın. Yani 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4). Şimdi, sağ ilişkisel operatörlerin sonsuz sırasına nasıl bir değer atayabilirsiniz?

F (n, m, i) değerini, sonsuz güç kulesinin ilk i terimlerini içeren güç kulesi olarak tanımlayın. Sonra her i> C için f (n, m, i) = f (n, m, C) olacak şekilde bir sabit C vardır. Sonsuz güç kulesinin belirli bir değer üzerinde birleştiğini söyleyebilirsiniz. Bu değerle ilgileniyoruz.


Programınız makul bir modern bilgisayarda n = 2017, m = 10 ^ 10'u 10 saniyenin altında hesaplayabilmelidir. Yani, gerçek bir algoritma uygulamanız gerekir, kaba kuvvet uygulamanız gerekmez.

Programlama dilinizdeki sayısal sınırlar için n <2 30 ve m <2 50 olduğunu varsayabilirsiniz , ancak algoritmanızın teorik olarak herhangi bir n , m boyutu için çalışması gerekir . Ancak programınızın bu boyut sınırları içindeki girişler için doğru olması gerekir ; girişler bu sınırlar dahilindeyse ara değer taşmaları hariç tutulmaz .

Örnekler:

2, 10^15
566088170340352

4, 3^20
4

32, 524287
16

(Yarışmacının için) İpucu: nve medilir değil eş-asal olması garanti.
— Leaky Nun

1
10 ^ 10 (ve 10 ^ 20 ve işaretli tamsayılar için potansiyel olarak 3 ^ 20) birçok dilin varsayılan tamsayı türlerinden daha büyüktür. Bu kadar büyük bir girişin desteklenmesi gerekiyor mu?
— Kapı tokmağı

1
@orlp "Evet" ifadesi 10 ^ 20 içeriyor mu? Bu 64 bitlik bir tamsayıya uymadığından, eğer istiyorsanız, açıkça belirtmenizi öneririm, aksi takdirde 64 bit olduğunu varsayan insanlar tarafından çok sayıda geçersiz cevap alacaksınız. tamsayılar yeterince doğru olacaktır.
— Martin Ender

1
Her iki durumda da neler olduğunu desteklediğimiz gereken büyük girdi?
— Martin Ender

@Doorknob Meydan okumaya daha yumuşak limitler ekledim. Ancak algoritmanızın teorik olarak herhangi bir m, n boyutu için çalışması gerekir .
— orlp

Yanıtlar:


7

Pyth, 23 bayt

M&tG.^HsgBu-G/GH{PGGhHG

Bir sırayı sırayla m ve ng alarak bir işlev tanımlar .

Çevrimiçi deneyin

Nasıl çalışır

M&tG.^HsgBu-G/GH{PGGhHG
M                         def g(G, H):
 &tG                        0 if G == 1, else …
                 PG         prime factors of G
                {           deduplicate that
          u-G/GH   G        reduce that on lambda G,H:G-G/H, starting at G
                              (this gives the Euler totient φ(G))
        gB          hH      bifurcate: two-element list [that, g(that, H + 1)]
       s                    sum
    .^H               G     H^that mod G

Python 2, 109 76 bayt

import sympy
def g(n,m):j=sympy.totient(m);return m-1and pow(n,j+g(n+1,j),m)

Çevrimiçi deneyin!

Neden çalışıyor?

Euler teoreminin aşağıdaki genelleştirmesini kullanıyoruz .

Lemma. n 2φ ( m ) ≡ n φ ( m ) (mod m ) tüm n için ( n , m ile eşzamanlı olsun ya da olmasın ).

Kanıt: Bütün asal güçler için p k bölücü m ,

  • Eğer p bölme n , daha sonra da φ ( m ) ≥ φ ( p k ) = p k 1 - ( p - 1) ≥ 2 k 1 - ≥ k , biz , n 2φ ( m ) ≡ 0 ≡ n φ ( m ) (mod p k ).
  • Aksi takdirde, φ ( p k ) φ ( m ) 'yi böldüğü için , Euler teoremi n 2φ ( m ) ≡ 1 ≡ n φ ( m ) (mod p k ) değerini verir .

Bu nedenle, n 2φ ( m ) ≡ n φ ( m ) (mod m ).

Doğal sonucu. Eğer k ≥ φ ( m ), daha sonra n- k ≡ n φ ( m ) + ( k mod φ ( m )) (mod m ).

Korumalı: Eğer k ≥ 2φ ( m ), lemması verir , n k = N 2φ ( m ) n, k - 2φ ( m ) ≡ n φ ( m ) n, k - 2φ ( m ) = n- k - φ ( m ) ( mod m ) ve üs 2φ ( m ) ' den daha az olana kadar tekrar ediyoruz .


Bu, baz ve modülonun eş zamanlı olmadığı durumla nasıl başa çıkıyor? PS sympy'nin totient işlevi vardır.
— orlp

@orlp Bir kanıt ekledim. Nasıl özlediğimden emin değilim sympy.totient.
— Anders Kaseorg

Şimdi görüyorum. Güzel yöntem!
— orlp

5

Haskell , 156 bayt

(?)iki Integers alır ve bir döndürür Integer, olarak kullanın (10^10)?2017(OP ile karşılaştırıldığında ters sırada).

1?n=0
m?n=n&m$m#2+m#2?(n+1)
1#_=1
n#p|m<-until((<2).gcd p)(`div`p)n=m#(p+1)*1`max`div(n*p-n)(p*m)
(_&_)0=1
(x&m)y|(a,b)<-divMod y 2=mod(x^b*(mod(x*x)m&m)a)m

Çevrimiçi deneyin! (Bu kez üstelleme gösterimini kullandıkları için vakaları bu kez başlıkta test ettim.)

İlginç yavaş test durumu bir hız sınırı olan bir (neredeyse anlık var), ama değil 524287 ? 32, çünkü bir 524287diğer test vakalarının faktörler göründüğünü çok daha büyük asal olduğunu.

Nasıl çalışır

  • (x&m)yolduğu x^y `mod` m, ya da güç mod karesi alınarak üs kullanarak.
  • n#pEuler totient fonksiyonudur n, varsayımından ndaha küçük bir asal faktör yoktur p.
    • molan ntüm pfaktörleri göz bölünmüş.
    • kBöyle faktörler varsa , totient kendisi (p-1)*p^(k-1)olarak hesaplanan karşılık gelen bir faktör almalıdır div(n*p-n)(p*m).
    • 1`max`...ngerçekte bölünemez durumdaki durumu ele alır p, bu da diğer argümana maxeşittir 0.
  • Ana işlev m?n, yyeterince büyük olduğunda , totient ile ne zaman n^y `mod` maynı olduğunu kullanır . (Bu asal faktörler için gereklidir ve hepsi en üst düzeye çıkarılmış ortak noktalara sahiptir.)n^(t+(y`mod`t)) `mod` mtmt+nm
  • Yinelenen totient fonksiyonları sonunda 1'e çarptığından algoritma durur.

1

Mathematica, 55 bayt

n_~f~1=0;n_~f~m_:=PowerMod[n,(t=EulerPhi@m)+f[n+1,t],m]

Örnekler:

In[1]:= n_~f~1=0;n_~f~m_:=PowerMod[n,(t=EulerPhi@m)+f[n+1,t],m]

In[2]:= f[2, 10^15]

Out[2]= 566088170340352

In[3]:= f[4, 3^20]

Out[3]= 4

In[4]:= f[32, 524287]

Out[4]= 16

In[5]:= f[2017, 10^10]

Out[5]= 7395978241

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.