Python, 76 73 67 bytes
f=lambda n,k=1:1-any(a**-~k*~-a**k%n for a in range(n))or-~f(n,k+1)
Experimente online!
Um outro byte pode ser salvo retornando True em vez de 1 .
Implementação alternativa
Usando a mesma abordagem, também existe a seguinte implementação por @feersum, que não usa compreensão de lista.
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)
Observe que essa implementação requer tempo O (n λ (n) ) . A eficiência pode ser melhorada drasticamente enquanto diminui a pontuação para 66 bytes , mas a função retornará True para a entrada 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)
fundo
Definições e notação
Todas as variáveis empregadas indicarão números inteiros; n , k , e α denotará positivos inteiros; e p denotará um primo positivo .
a | b se b é divisível por a , ie, se houver q tal que b = qa .
a ≡ b ( mod m) se a e b tiverem o mesmo resíduo módulo m , ou seja, se m | a - b .
λ (n) é o menor k tal que um k ≡ 1 ( mod n) - ou seja, tal que n | um k - 1 - para todo um que são primos entre si para n .
f (n) representa a menor k tal que um 2k + 1 ≡ um k + 1 ( mod n) - ou seja, de tal modo que n | a k + 1 (a k - 1) - para todos a .
λ (n) ≤ f (n)
Corrija n e deixe a ser coprime para n .
Pela definição de f , n | a f (n) +1 (a f (n) - 1) . Desde um e n não tem um fator primo comum, nem um f (n) 1 e n , o que implica que n | a f (n) - 1 .
Como λ (n) é o menor número inteiro k tal que n | a k - 1 para todos os inteiros a que são coprime para n , segue-se que λ (n) ≤ f (n) .
λ (n) = f (n)
Como já estabelecemos a desigualdade λ (n) ≤ f (n) , é suficiente verificar que k = λ (n) satisfaz a condição que define f , ou seja, que n | a λ (n) +1 (a λ (n) - 1) para todos a . Para esse fim, estabeleceremos que p α | a λ (n) +1 (a λ (n) - 1) sempre que p α | n .
λ (k) λ (n) sempre que k | n ( fonte ), então (a λ (k) - 1) (a λ (n) -λ (k) + a λ (n) -2λ (k) + ⋯ + a λ (k) + 1) = a λ (n) - 1 e, portanto, a λ (k) - 1 | a λ (n) - 1 | a λ (n) +1 (a λ (n) - 1) .
Se a e p α são coprime, pela definição de λ e acima, p α | a λ (p α ) - 1 | a λ (n) +1 (a λ (n) - 1) segue, conforme desejado.
Se a = 0 , em seguida, um λ (n) 1 (um λ (n) - 1) = 0 , que é divisível por todos os inteiros.
Finalmente, devemos considerar o caso em que um e p α tem um fator primordial comum. Como p é primo, isso implica que p | a . O teorema de Carmichael estabelece que λ (p α ) = (p - 1) p α - 1 se p> 2 ou α <3 e que λ (p α ) = p α - 2 caso contrário. Em todos os casos, λ (p α ) ≥ p α - 2 ≥ 2 α - 2 > α - 2 .
Portanto, λ (n) + 1 ≥ λ (p α ) + 1> α - 1 , de modo λ (n) + 1 ≥ α e p α | p λ (n) +1 | a λ (n) +1 | a λ (n) +1 (a λ (n) - 1) . Isso completa a prova.
Como funciona
Enquanto as definições de f (n) e λ (n) consideram todos os valores possíveis de a , é suficiente testar aqueles que estão em [0, ..., n - 1] .
Quando f (n, k) é chamada, ele calcula um k + 1 (um k - 1)% n para todos os valores de um nessa gama, o que é 0 , se e somente se n | a k + 1 (a k - 1) .
Se todos os resíduos calculados forem zero, k = λ (n) e any
retorna False , então f (n, k) retorna 1 .
Por outro lado, enquanto k <λ (n) , 1-any(...)
retornará 0 , então f é chamado recursivamente com um valor incrementado de k . O início -~
incrementa o valor de retorno de f (n, k + 1) , então adicionamos 1 a f (n, λ (n)) = 1 uma vez para cada número inteiro em [1, ..., λ (n) - 1 ] . O resultado final é, portanto, λ (n) .