Python, 76 73 67 byte
f=lambda n,k=1:1-any(a**-~k*~-a**k%n for a in range(n))or-~f(n,k+1)
Cobalah online!
Byte lebih lanjut dapat disimpan dengan mengembalikan True, bukan 1 .
Implementasi alternatif
Menggunakan pendekatan yang sama, ada juga implementasi berikut oleh @feersum yang tidak menggunakan pemahaman daftar.
f=lambda n,k=1,a=1:a/n or(a**-~k*~-a**k%n<1)*f(n,k,a+1)or-~f(n,k+1)
Perhatikan bahwa implementasi ini membutuhkan waktu O (n λ (n) ) . Efisiensi dapat ditingkatkan secara dramatis sementara sebenarnya menurunkan skor menjadi 66 byte , tetapi fungsi tersebut akan mengembalikan True untuk input 2 .
f=lambda n,k=1,a=1:a/n or~-a**k*a**-~k%n<1==f(n,k,a+1)or-~f(n,k+1)
Latar Belakang
Definisi dan notasi
Semua variabel yang dipekerjakan akan menunjukkan bilangan bulat; n , k , dan α akan menunjukkan bilangan bulat positif ; dan p akan menunjukkan prima positif .
a | b jika b dapat dibagi dengan a , yaitu, jika ada q sehingga b = qa .
a ≡ b ( mod m) jika a dan b memiliki sama residu modulo m , yaitu, jika m | a - b .
λ (n) adalah k terkecil sehingga a k ≡ 1 ( mod n) - yaitu, sedemikian sehingga n | a k - 1 - untuk semua a yang merupakan koprime ke n .
f (n) adalah yang terkecil k sehingga sebuah 2k + 1 ≡ a k + 1 ( mod n) - yaitu, sehingga n | a k + 1 (a k - 1) - untuk semua a .
λ (n) ≤ f (n)
Fix n dan membiarkan sebuah coprime be ke n .
Dengan definisi f , n | a f (n) +1 (a f (n) - 1) . Karena a dan n tidak memiliki faktor prima yang sama, maka juga tidak ada f (n) +1 dan n , yang menyiratkan bahwa n | a f (n) - 1 .
Karena λ (n) adalah bilangan bulat terkecil k sehingga n | a k - 1 untuk semua bilangan bulat a yang merupakan koprime ke n , berarti λ (n) ≤ f (n) .
λ (n) = f (n)
Karena kita telah menetapkan ketimpangan λ (n) ≤ f (n) , cukup untuk memverifikasi bahwa k = λ (n) memenuhi kondisi yang mendefinisikan f , yaitu, bahwa n | a λ (n) +1 (a λ (n) - 1) untuk semua a . Untuk tujuan ini, kami akan menetapkan p α | a λ (n) +1 (a λ (n) - 1) setiap kali p α | n .
λ (k) | λ (n) setiap kali k | n ( sumber ), jadi (a λ (k) - 1) (a λ (n) -λ (k) + a λ (n) -2λ (k) + ⋯ + a λ (k) + 1) = a λ (n) - 1 dan, karenanya, a λ (k) - 1 | a λ (n) - 1 | a λ (n) +1 (a λ (n) - 1) .
Jika a dan p α adalah koprime, dengan definisi λ dan yang di atas, p α | a λ (p α ) - 1 | a λ (n) +1 (a λ (n) - 1) mengikuti, seperti yang diinginkan.
Jika a = 0 , maka suatu λ (n) 1 (a λ (n) - 1) = 0 , yang habis dibagi semua bilangan bulat.
Akhirnya, kita harus mempertimbangkan kasus di mana a dan p α memiliki faktor prima yang sama. Karena p adalah prima, ini menyiratkan bahwa p | a . Teorema Carmichael menyatakan bahwa λ (p α ) = (p - 1) p α - 1 jika p> 2 atau α <3 dan λ (p α ) = p α - 2 sebaliknya. Dalam semua kasus, λ (p α ) ≥ p α - 2 ≥ 2 α - 2 > α - 2 .
Karenanya, λ (n) + 1 ≥ λ (p α ) + 1> α - 1 , jadi λ (n) + 1 ≥ α dan p α | p λ (n) +1 | a λ (n) +1 | a λ (n) +1 (a λ (n) - 1) . Ini melengkapi buktinya.
Bagaimana itu bekerja
Sementara definisi f (n) dan λ (n) mempertimbangkan semua nilai yang mungkin dari a , cukup untuk menguji mereka yang terletak pada [0, ..., n - 1] .
Ketika f (n, k) disebut, itu menghitung sebuah k + 1 (a k - 1)% n untuk semua nilai yang di kisaran itu, yang 0 jika dan hanya jika n | a k + 1 (a k - 1) .
Jika semua residu yang dihitung adalah nol, k = λ (n) dan any
mengembalikan False , jadi f (n, k) mengembalikan 1 .
Di sisi lain, sementara k <λ (n) , 1-any(...)
akan mengembalikan 0 , sehingga f disebut secara rekursif dengan nilai k yang meningkat . Yang terkemuka -~
menambahkan nilai kembali dari f (n, k + 1) , jadi kami menambahkan 1 ke f (n, λ (n)) = 1 satu kali untuk setiap bilangan bulat dalam [1, ..., λ (n) - 1 ] . Hasil akhirnya adalah λ (n) .