Diberi dua angka n dan m, evaluasi menara listrik tanpa batas:
n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m
Perlu diingat bahwa ^ asosiatif-benar. Jadi 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4). Sekarang bagaimana Anda bisa menetapkan nilai ke urutan tak terbatas operator asosiasi kanan?
Tentukan f (n, m, i) sebagai menara listrik yang berisi syarat-syarat i pertama dari menara listrik tanpa batas. Lalu ada beberapa konstanta C sehingga untuk setiap i> C, f (n, m, i) = f (n, m, C). Jadi Anda bisa mengatakan menara listrik tak terbatas berkumpul pada nilai tertentu. Kami tertarik dengan nilai itu.
Program Anda harus dapat menghitung n = 2017, m = 10 ^ 10 dalam waktu kurang dari 10 detik pada PC modern yang wajar. Artinya, Anda harus menerapkan algoritma yang sebenarnya, tanpa bruteforcing.
Anda dapat mengasumsikan bahwa n <2 30 dan m <2 50 untuk batas numerik dalam bahasa pemrograman Anda, tetapi algoritma Anda harus secara teoritis bekerja untuk ukuran apa pun n , m . Namun program Anda harus benar untuk input dalam batas ukuran ini, kelebihan nilai menengah tidak dimaafkan jika input berada dalam batas ini.
Contoh:
2, 10^15
566088170340352
4, 3^20
4
32, 524287
16
sumber
n
danm
yang tidak dijamin akan co-prime.Jawaban:
Pyth, 23 byte
Menentukan fungsi
g
, mengambil m dan n dalam urutan itu.Cobalah online
Bagaimana itu bekerja
Python 2,
10976 byteCobalah online!
Mengapa ini berhasil?
Kami menggunakan generalisasi teorema Euler berikut ini .
Kata pengantar singkat. n 2φ ( m ) ≡ n φ ( m ) (mod m ) untuk semua n (apakah n adalah coprime atau tidak terhadap m ).
Bukti: Untuk semua kekuatan utama p k membagi m ,
Oleh karena itu, n 2φ ( m ) ≡ n φ ( m ) (mod m ).
Akibat wajar. Jika k ≥ φ ( m ), maka n k ≡ n φ ( m ) + ( k mod φ ( m )) (mod m ).
Bukti: Jika k ≥ 2φ ( m ), lemma memberikan n k = n 2φ ( m ) n k - 2φ ( m ) ≡ n φ ( m ) n k - 2φ ( m ) = n k - φ ( m ) ( mod m ) dan kami ulangi sampai eksponen kurang dari 2φ ( m ).
sumber
sympy.totient
.Haskell , 156 byte
(?)
membutuhkan duaInteger
detik dan mengembalikanInteger
, gunakan sebagai(10^10)?2017
(urutan terbalik dibandingkan dengan OP.)Cobalah online! (Saya menempatkan case untuk diuji di header kali ini, karena mereka menggunakan notasi eksponensial.)
Anehnya, test case paling lambat bukanlah yang dengan batas kecepatan (itu hampir instan), tetapi yang
524287 ? 32
pertama, karena524287
merupakan prime yang jauh lebih besar daripada yang muncul di faktor-faktor dari test case yang lain.Bagaimana itu bekerja
(x&m)y
adalahx^y `mod` m
, atau power mod, menggunakan eksponensial dengan mengkuadratkan.n#p
adalah fungsi totient Eulern
, dengan asumsin
tidak memiliki faktor prima yang lebih kecil darip
.m
adalahn
dengan semuap
faktor dibagi keluar.k
faktor-faktor seperti itu, totient itu sendiri harus mendapatkan faktor yang sesuai(p-1)*p^(k-1)
, yang dihitung sebagaidiv(n*p-n)(p*m)
.1`max`...
menangani kasus di manan
sebenarnya tidak habis dibagip
, yang membuat argumen lainmax
sama dengan0
.m?n
menggunakan itu ketikay
cukup besar,n^y `mod` m
sama dengann^(t+(y`mod`t)) `mod` m
, ketikat
adalah totalm
. (t+
Dibutuhkan untuk faktorn
- faktor utama danm
memiliki kesamaan, yang semuanya dimaksimalkan.)sumber
Mathematica, 55 byte
Contoh:
sumber
Pari / GP , 59 byte
Cobalah online!
sumber