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- kn φ ( 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.