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)
Pruébalo en línea!
Se podría guardar un byte adicional devolviendo True en lugar de 1 .
Implementación alternativa
Usando el mismo enfoque, también existe la siguiente implementación de @feersum que no utiliza listas de comprensión.
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)
Tenga en cuenta que esta implementación requiere O (n λ (n) ) tiempo. La eficiencia podría mejorarse drásticamente mientras se reduce la puntuación a 66 bytes , pero la función devolvería True para la 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)
Fondo
Definiciones y notación
Todas las variables empleadas denotarán enteros; n , k y α denotarán enteros positivos ; y p denotará un primo positivo .
a | b si b es divisible por a , es decir, si hay q tal que b = qa .
a ≡ b ( mod m) si una y b tienen el mismo residuo módulo m , es decir, si m | a - b .
λ (n) es la k más pequeña tal que a k ≡ 1 ( mod n) , es decir, tal que n | un k - 1 - para todos una que son primos entre sí a n .
f (n) es la k más pequeña de manera que a 2k + 1 ≡ a k + 1 ( mod n) , es decir, tal que n | a k + 1 (a k - 1) - para todo a .
λ (n) ≤ f (n)
Arregle ny deje que a sea coprime a n .
Por la definición de f , n | a f (n) +1 (a f (n) - 1) . Desde una y n no tienen un factor primordial común, ni hacer una f (n) 1 y n , lo que implica que n | a f (n) - 1 .
Como λ (n) es el entero más pequeño k tal que n | a k - 1 para todos los enteros a que son coprimos a n , se deduce que λ (n) ≤ f (n) .
λ (n) = f (n)
Como ya hemos establecido la desigualdad λ (n) ≤ f (n) , es suficiente verificar que k = λ (n) satisfaga la condición que define f , es decir, que n | a λ (n) +1 (a λ (n) - 1) para todo a . Para este propósito, estableceremos que p α | a λ (n) +1 (a λ (n) - 1) siempre que p α | n .
λ (k) | λ (n) siempre que k | n ( fuente ), entonces (a λ (k) - 1) (a λ (n) -λ (k) + a λ (n) -2λ (k) + ⋯ + a λ (k) + 1) = a λ (n) - 1 y, por lo tanto, a λ (k) - 1 | a λ (n) - 1 | a λ (n) +1 (a λ (n) - 1) .
Si una y p α son primos entre sí, por la definición de λ y el anterior, p α | a λ (p α ) - 1 | a λ (n) +1 (a λ (n) - 1) sigue, según se desee.
Si a = 0 , entonces a λ (n) +1 (a λ (n) - 1) = 0 , que es divisible por todos los enteros.
Finalmente, debemos considerar el caso donde a y p α tienen un factor primo común. Como p es primo, esto implica que p | a . El teorema de Carmichael establece que λ (p α ) = (p - 1) p α - 1 si p> 2 o α <3 y que λ (p α ) = p α - 2 de lo contrario. En todos los casos, λ (p α ) ≥ p α - 2 ≥ 2 α - 2 > α - 2 .
Por lo tanto, λ (n) + 1 ≥ λ (p α ) + 1> α - 1 , entonces λ (n) + 1 ≥ α y p α | p λ (n) +1 | a λ (n) +1 | a λ (n) +1 (a λ (n) - 1) . Esto completa la prueba.
Cómo funciona
Si bien las definiciones de f (n) y λ (n) consideran todos los valores posibles de a , es suficiente probar los que se encuentran en [0, ..., n - 1] .
Cuando se llama f (n, k) , calcula un k + 1 (a k - 1)% n para todos los valores de a en ese rango, que es 0 si y solo si n | a k + 1 (a k - 1) .
Si todos los residuos calculados son cero, k = λ (n) y any
devuelve False , entonces f (n, k) devuelve 1 .
Por otro lado, mientras k <λ (n) , 1-any(...)
devolverá 0 , por lo que f se llama recursivamente con un valor incrementado de k . Los -~
valores iniciales incrementan el valor de retorno de f (n, k + 1) , por lo que agregamos 1 a f (n, λ (n)) = 1 una vez por cada entero en [1, ..., λ (n) - 1 ] . El resultado final es así λ (n) .