파이썬, 76 73 67 바이트
f=lambda n,k=1:1-any(a**-~k*~-a**k%n for a in range(n))or-~f(n,k+1)
온라인으로 사용해보십시오!
1 대신 True 를 반환하여 추가 바이트를 저장할 수 있습니다 .
대체 구현
동일한 접근 방식을 사용하여 목록 이해를 사용하지 않는 @feersum의 다음 구현도 있습니다.
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)
이 구현에는 O (n λ (n) ) 시간 이 필요합니다 . 실제로 점수를 66 바이트 로 줄이면서 효율성을 대폭 향상시킬 수 있지만이 함수는 입력 2에 대해 True 를 반환 합니다.
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)
배경
정의와 표기법
사용 된 모든 변수는 정수를 나타냅니다. n , k 및 α 는 양의 정수 를 나타내고 ; 및 p는 긍정적 나타내는 것이다 프라임 .
| B 경우 B는 로 나누어 있을 경우, 즉, Q 되도록 B = QA .
a 와 b 가 동일한 잔차 모듈로 m을 갖는 경우 a m b ( mod m) , 즉 m | a-b .
λ (n) 은 k ≡ 1 ( mod n) 과 같이 가장 작은 k 입니다 . 즉, n | K - 1 - 모든 에 서로 소있다 N .
F (N)은 최소이고 K 되도록 2K + 1 ≡ K + 1 ( 개조 N) - 즉, 그와 같은 N | a k + 1 (a k -1) – 모두 a .
λ (n) ≤ f (n)
수정 N 및하자 하는 서로 소 N을 .
의 정의에 의해 F , N | a f (n) +1 (a f (n) -1) . 이후 및 n은 공통의 주요 요인이 없다, 어느 쪽도하지 않는다 F (N)를 1 및 N , 그 의미하는 N을 | a f (n) -1 입니다.
이후 λ (n)의 최소 정수이며 , k는 그러한 | N K - 1 모든 정수의 에 서로 소있는 N은 , 그 다음 λ (N) ≤ F (N)를 .
λ (n) = f (n)
이미 부등식 설정 했으므로 λ (N) ≤ F (N)을 ,이 있는지 확인하기에 충분하다 K = λ (n)을 만족하는 조건을하도록 정의 F , 즉, 그 N | λ (n)를 +1 (a λ (N) - 1) 모든 . 이를 위해 p α | p α | 때마다 a λ (n) +1 (a λ (n) -1) n .
λ (k) | λ (n) 언제나 k | n ( source )이므로 (a λ (k) -1) (a λ (n) -λ (k) + a λ (n) -2λ (k) + ⋯ + a λ (k) + 1) = a λ (N) - 1 및, 따라서, λ (K) - (1) | a λ (n) -1 | λ (n)를 +1 (a λ (N) - 1) .
만약 및 P α 의 정의에 의해, 서로 소입니다 λ 와 위, P는 α | a λ (p α ) -1 | 원하는대로 λ (n) +1 (a λ (n) -1)이 뒤 따른다.
만약 A = 0 , 다음 λ (n)를 +1 (a λ (N) - 1) = 0 인 모든 정수로 나누어.
마지막으로, a 와 p α 가 공통 소인수를 갖는 경우를 고려해야합니다 . 이후 p는 소수, 이것은 그 의미 | 페이지를 . 카 마이클 정리 는 p> 2 또는 α <3 이면 λ (p α ) = (p-1) p α-1 이고 그렇지 않으면 λ (p α ) = p α-2 임을 설정 합니다. 모든 경우에 λ (p α ) ≥ p α-2 ≥ 2 α-2 > α-2 입니다.
따라서 λ (n) + 1 ≥ λ (p α ) + 1> α-1 이므로 λ (n) + 1 ≥ α 및 p α | p λ (n) +1 | λ (n)를 1 | λ (n)를 +1 (a λ (N) - 1) . 이것으로 증명이 완료됩니다.
작동 원리
f (n) 및 λ (n) 의 정의는 a의 모든 가능한 값을 고려 하지만 [0, ..., n-1] 에 있는 값 을 테스트하는 것으로 충분합니다 .
하면 F가 (N, K)를 호출하고, 그 계산 K + 1 (a K - 1) % N 의 모든 값에 대해 하다 범위에서 0 이하의 경우 만 N | K + 1 (a K - 1) .
계산 된 모든 잔기가 0이면 k = λ (n) 이고 False를any
반환 하므로 f (n, k) 는 1을 반환합니다 .
반면 k <λ (n) 에서는 01-any(...)
을 반환 하므로 f 는 증가 된 값 k로 재귀 적으로 호출 됩니다. 리딩 은 f (n, k + 1) 의 반환 값을 증가 시키므로 [1, ..., λ (n)-1의 모든 정수에 대해 1 에 f (n, λ (n)) = 1을 1 씩 더합니다 ] . 최종 결과는 따라서 λ (n) 입니다.-~