GolfScript (23 caractères)
{:^((1${\.**2^?%}+*}:f;
Le résultat sentinelle pour un inverse inexistant est 0
.
Il s'agit d'une application simple du théorème d' Euler . , donc x - 1 ≡ x 2 n - 1 - 1xφ(2n)≡1(mod2n)x−1≡x2n−1−1(mod2n)
Malheureusement, c'est une exponentielle un peu trop grande pour être calculée directement, nous devons donc utiliser une boucle et effectuer une réduction modulaire à l'intérieur de la boucle. L'étape itérative est et nous avons le choix du cas de base: soit avecx2k−1=(x2k−1−1)2×xk=1
{1\:^(@{\.**2^?%}+*}:f;
ou k=2
avec
{:^((1${\.**2^?%}+*}:f;
Je travaille sur une autre approche, mais la sentinelle est plus difficile.
L'observation clé est que nous pouvons construire l'inverse vers le haut peu à peu: si puis x y ∈ { 1 , 1 + 2 k - 1xy≡1(mod2k−1) , et si x est impair, nous avons x ( y + x y - 1 ) ≡ 1xy∈{1,1+2k−1}(mod2k)x . (Si vous n'êtes pas convaincu, vérifiez les deux cas séparément). Nous pouvons donc commencer à n'importe quel cas de base approprié et appliquer la transformation y ′ = ( x + 1 ) y - 1 un nombre approprié de fois.x(y+xy−1)≡1(mod2k)y′=(x+1)y−1
Depuis on obtient, par induction0x≡1(mod20)
x(1−(x+1)nx)≡1(mod2n)
où l'inverse est la somme d'une séquence géométrique. J'ai montré la dérivation pour éviter l'effet lapin hors du chapeau: étant donné cette expression, il est facile de voir que (étant donné que la valeur entre crochets est un entier, qui découle de sa dérivation comme une somme d'un entier séquence) le produit de gauche doit être dans la classe d'équivalence droite si est pair.x+1
Cela donne la fonction 19 caractères
{1$)1$?@/~)2@?%}:f;
qui donne des réponses correctes pour les entrées qui ont un inverse. Cependant, ce n'est pas si simple quand est pair. Une option potentiellement intéressante que j'ai trouvée est d'ajouter plutôt que .xx&1
1
{1$.1&+1$?@/~)2@?%}:f;
02n−1 , mais je ne l'ai pas encore prouvé.
01−(x+1)n1−1n
{1$.1&*)1$?@/~)2@?%}:f;
nn x f
{..1&*)2$?\/~)2@?%}:f;