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)
Hãy thử trực tuyến!
Một byte nữa có thể được lưu bằng cách trả về True thay vì 1 .
Thực hiện thay thế
Sử dụng cách tiếp cận tương tự, cũng có cách triển khai sau đây của @feersum mà không sử dụng cách hiểu danh sách.
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)
Lưu ý rằng việc thực hiện này đòi hỏi thời gian O (n λ (n) ) . Hiệu quả có thể được cải thiện đáng kể trong khi thực sự giảm điểm xuống còn 66 byte , nhưng hàm sẽ trả về True cho đầu vào 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)
Lý lịch
Định nghĩa và ký hiệu
Tất cả các biến được sử dụng sẽ biểu thị số nguyên; n , k và α sẽ biểu thị các số nguyên dương; và p sẽ biểu thị một số nguyên tố dương .
một | b nếu b chia hết cho a , tức là nếu có q sao cho b = qa .
a ≡ b ( mod m) nếu a và b có cùng dư lượng modulo m , nghĩa là, nếu m | a - b .
(n) là k nhỏ nhất sao cho a k ≡ 1 ( mod n) - tức là sao cho n | a k - 1 - cho tất cả a là nguyên tố cùng với n .
f (n) là k nhỏ nhất sao cho a 2k + 1 a k + 1 ( mod n) - tức là sao cho n | a k + 1 (a k - 1) - với mọi a .
λ (n) ≤ f (n)
Khắc phục n và để một số nguyên tố cho n .
Theo định nghĩa của f , n | a f (n) +1 (a f (n) - 1) . Kể từ khi một và n không có một yếu tố chính thông thường, không phải làm một f (n) +1 và n , trong đó hàm ý rằng n | một f (n) - 1 .
Vì (n) là số nguyên k nhỏ nhất sao cho n | a k - 1 cho tất cả các số nguyên a tương ứng với n , nó theo đó (n) f (n) .
λ (n) = f (n)
Vì chúng ta đã thiết lập bất đẳng thức λ (n) ≤ f (n) , nên đủ để xác minh rằng k = λ (n) thỏa mãn điều kiện xác định f , tức là n | a λ (n) +1 (a λ (n) - 1) cho tất cả a . Với mục đích này, chúng tôi sẽ thiết lập rằng p α | a λ (n) +1 (a λ (n) - 1) bất cứ khi nào p α | n .
λ (k) | (n) bất cứ khi nào k | n ( nguồn ), vì vậy (a λ (k) - 1) (a λ (n) -λ (k) + a λ (n) -2λ (k) + ⋯ + a λ (k) + 1) = a (n) - 1 và do đó, a (k) - 1 | một λ (n) - 1 | a (n) +1 (a λ (n) - 1) .
Nếu a và p α là nguyên tố cùng nhau, theo định nghĩa của λ và ở trên, p α | a λ (p α ) - 1 | a (n) +1 (a λ (n) - 1) theo sau, như mong muốn.
Nếu a = 0 , thì a (n) +1 (a λ (n) - 1) = 0 , chia hết cho tất cả các số nguyên.
Cuối cùng, chúng ta phải xem xét trường hợp a và p α có thừa số nguyên tố chung. Vì p là số nguyên tố, điều này hàm ý rằng p | a . Định lý của Carmichael thiết lập rằng λ (p α ) = (p - 1) p α - 1 nếu p> 2 hoặc α <3 và điều đó (p α ) = p α - 2 nếu không. Trong mọi trường hợp, (p α ) p α - 2 2 α - 2 > α - 2 .
Do đó, λ (n) + 1 (p α ) + 1> α - 1 , do đó (n) + 1 ≥ α và p α | p λ (n) +1 | một λ (n) +1 | a (n) +1 (a λ (n) - 1) . Điều này hoàn thành bằng chứng.
Làm thế nào nó hoạt động
Mặc dù các định nghĩa của f (n) và (n) xem xét tất cả các giá trị có thể có của a , nhưng nó đủ để kiểm tra các giá trị nằm trong [0, ..., n - 1] .
Khi f (n, k) được gọi, nó sẽ tính toán một k + 1 (một k - 1)% n cho tất cả các giá trị của một trong phạm vi đó, đó là 0 khi và chỉ khi n | một k + 1 (một k - 1) .
Nếu tất cả các phần dư được tính bằng 0, k = (n) và any
trả về Sai , vì vậy f (n, k) trả về 1 .
Mặt khác, trong khi k <λ (n) , 1-any(...)
sẽ trả về 0 , do đó f được gọi đệ quy với giá trị tăng là k . Hàng đầu -~
tăng giá trị trả về của f (n, k + 1) , vì vậy chúng tôi thêm 1 vào f (n, (n)) = 1 một lần cho mỗi số nguyên trong [1, ..., λ (n) - 1 ] . Kết quả cuối cùng là do đó (n) .