Python, 76 73 67 bayt
f=lambda n,k=1:1-any(a**-~k*~-a**k%n for a in range(n))or-~f(n,k+1)
Çevrimiçi deneyin!
Bir başka bayt döndürerek kaydedilmiş olabilir True yerine 1 .
Alternatif uygulama
Aynı yaklaşımı kullanarak, @feersum tarafından liste kavramalarını kullanmayan aşağıdaki uygulama da vardır.
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)
Bu uygulamanın O (n λ (n) ) zaman gerektirdiğini unutmayın . Aslında ise Verimlilik dramatik geliştirilebilir azalan skoru 66 bayt , ancak işlevi dönecekti Gerçek girişi için 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)
Arka fon
Tanımlar ve gösterim
Kullanılan tüm değişkenler tamsayıları belirtir; n , k ve a , pozitif tamsayıları belirtir ; ve p , pozitif bir prime işaret edecektir .
bir | b ise b bölünebilen bir varsa, örneğin, q, öyle ki B = qa .
a b b ( mod m), eğer a ve b , aynı kalıntı modulo m'ye sahipse, yani m | a - b .
λ (n) küçüğüdür k öyle ki bir k ≡ 1 ( mod n) - yani, öyle ki n | Bir k - 1 - herkes için a kadar aralarında asal olan n .
f (n) en küçük k'dir ki öyle bir 2k + 1 ≡ a k + 1 ( mod n) - yani n | a k + 1 (a k - 1) - tümü için a .
λ (n) ≤ f (n)
Düzeltme n ve let bir etmek be asal n .
F tanımı ile , n | a f (n) +1 (a f (n) -1) . Yana bir ve n ortak bir asal çarpanı var, ne yapmıyoruz bir f (n) +1 ve n , ima hangi n | bir f (n) -1 .
Yana λ (n) en küçük tamsayıdır k öyle | n Bir k - 1 tüm tamsayılar için bir karşı aralarında asal olan n , o kadar izler  (n) ≤ f (n) .
λ (n) = f (n)
Λ (n) ≤ f (n) eşitsizliğini zaten kurduğumuzdan , k = λ (n) 'in f , yani n | ' yi tanımlayan koşulu sağladığını doğrulamak yeterlidir. Bir λ (n) + 1 , (a λ (n) - 1) için tüm a . Bunun için p α | Bir λ (n) + 1 , (a λ (n) - 1) her s a | n .
λ (k) | λ (n) ne zaman k | n ( kaynak ), yani (a k (k) -1) (a λ (n) -λ (k) + a λ (n) -2λ (k) + ⋯ + a λ (k) + 1) = a λ (n) - 1 ve bu nedenle bir λ (k) - 1 | bir λ (n) - 1 | bir λ (n) +1 (a λ (n) -1) .
Eğer a ve p α eşdüzeyse, λ ve yukarıdakilerin tanımlarına göre , p α | a λ (p α ) - 1 | istenildiği gibi bir λ (n) +1 (a λ (n) - 1) takip eder.
Eğer a = 0 ise , tüm tamsayılar tarafından bölünebilen bir λ (n) +1 (a λ (n) - 1) = 0 olur .
Son olarak, a ve p α'nın ortak bir asal çarpan olduğu durumu düşünmeliyiz . Yana p asal, bu ima | s a . Carmichael teoremi kurar bu λ (s α ) (p = 1 -) p- α - 1 ise p> 2 ya da α <3 ve λ (s α ) p = α - 2 başka şekilde. Her durumda, λ (p α ) ≥ p α - 2 ≥ 2 α - 2 > α - 2 .
Bu nedenle λ (n) + 1 ≥ (p α ) + 1> α - 1 , yani λ (n) + 1 ≥ α ve p α | p λ (n) +1 | a λ (n) +1 | bir λ (n) +1 (a λ (n) -1) . Bu ispat tamamlar.
Nasıl çalışır
Tanımları da f (n) ve λ (n) tüm olası değerleri dikkate bir , bunun içinde o bu yalan test etmek için yeterlidir [0, ..., n - 1] .
Ne zaman f (n, k) denir, bu hesaplar bir k + 1 (a k - 1)% n tüm değerleri için bir olduğunu aralığında 0 ancak ve ancak n | bir k + 1 (a k - 1) .
Tüm hesaplanan kalıntıları sıfır ise, K = λ (n) ve any
döner yanlış , yani f (n, k) döndürür 1 .
Öte yandan, k <n (n) , 01-any(...)
değerini döndürürken , f art arda k değeri ile tekrarlanır . Öncü , f (n, k + 1) ' in dönüş değerini artırır , bu yüzden [1, ..., λ (n) - 1' deki her tam sayı için 1 - f (n, λ (n)) = 1 ekleriz ] . Son sonuç λ (n) 'dir .-~