Python,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)
在线尝试!
通过返回True而不是1可以保存另一个字节。
替代实施
使用相同的方法,@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。
一个≡B(MOD M)如果一个和b具有相同的残基模米,即,如果M | a-b。
λ(N)是最小ķ使得一个ķ ≡1(MOD N) -即,使得N | 一个ķ - 1 -对于所有一个是互质Ñ。
F(N)是最小ķ使得一个2K + 1 ≡一个K + 1(MOD N) -即,使得N | a k + 1(a k -1) –对于所有a。
λ(n)≤f(n)
修复n并将a设为n的互质。
根据f的定义,n | a f(n)+1(a f(n) -1)。由于一个和ñ没有一个共同的主要因素,无论是做一个F(N)+1和ñ,这意味着N | 一个f(n) -1。
由于λ(n)是最小整数k,因此n | n 对于与n互质的所有整数a 的k -1,得出λ(n)≤f(n)。
λ(n)= f(n)
由于我们已经建立了不等式λ(n)≤f(n),因此足以验证k =λ(n)满足定义f的条件,即n | 一个λ(n)的1(一个λ(N) - 1)对于所有一个。为此,我们将建立p α | 一个λ(n)的1(一个λ(N) - 1)每当p α | n。
λ(k)| λ(n)每当k | Ñ(源),因此(A λ(k)的 - 1)(一个λ(N)-λ(k)的 +一个λ(N)-2λ(K) +⋯+一个λ(k)的 + 1)=一λ(N) - 1,因此,一个λ(k)的 - 1 | 一个λ(N) - 1 | 一个λ(n)的1(一个λ(N) - 1) 。
如果一个和p α是互质,通过定义λ和上述中,p α | 一个λ(P α) - 1 | 根据需要跟随一个λ(n)+1(aλ(n) -1)。
如果α= 0,则一λ(n)的1(一个λ(N) - 1)= 0,这是通过所有整数整除。
最后,我们必须考虑这样的情况一和p α都有一个共同的主要因素。由于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(一个λ(N) - 1) 。这样就完成了证明。
怎么运行的
尽管f(n)和λ(n)的定义考虑了a的所有可能值,但足以测试[0,...,n-1]中的值。
当F(N,K)被调用时,它计算一个K + 1(一个ķ - 1)%N为的所有值一个在该范围内,这是0,当且仅当N | a k + 1(a k -1)。
如果所有计算的残差均为零,则k =λ(n)并any
返回False,因此f(n,k)返回1。
另一方面,当k <λ(n)时,1-any(...)
将返回0,因此f以递增的值k递归调用。前导-~
使f(n,k + 1)的返回值递增,因此对于[1,...,λ(n)-1中的每个整数,我们将1加到f(n,λ(n))= 1一次]。因此,最终结果为λ(n)。