La tâche est la suivante. Étant donné un entier x
(tel que x
modulo 100000000003
n'est pas égal à 0
) présenté à votre code de la manière qui vous convient, sortez un autre entier y < 100000000003
pour que (x * y) mod 100000000003 = 1
.
Votre code doit prendre moins de 30 minutes pour s'exécuter sur une machine de bureau standard pour toute entrée de ce x
type |x| < 2^40
.
Cas de test
Entrée: 400000001. Sortie: 65991902837
Entrée: 4000000001. Sortie: 68181818185
Entrée: 2. Sortie: 50000000002
Entrée: 50000000002. Sortie: 2.
Entrée: 1000000. Sortie: 33333300001
Restrictions
Vous ne pouvez pas utiliser de bibliothèques ou de fonctions intégrées qui effectuent l'arithmétique modulo (ou cette opération inverse). Cela signifie que vous ne pouvez même pas vous a % b
passer de %
votre propre implémentation . Vous pouvez cependant utiliser toutes les autres fonctions intégrées arithmétiques non modulo.
Question similaire
Ceci est similaire à cette question, même si nous l'espérons suffisamment différent pour être toujours intéressant.
100000000003
? (je me demandais juste)Réponses:
Pyth, 24 octets
Suite de tests
Ceci utilise le fait qu'un ^ (p-2) mod p = un ^ -1 mod p.
Tout d'abord, je réimplémente manuellement le module, pour le cas spécifique du mod 100000000003. J'utilise la formule
a mod b = a - (a/b)*b
, où/
est la division au sol. Je génère le module avec10^11 + 3
, en utilisant le code+3^T11
, puis l'enregistreJ
, puis utilise ceci et la formule ci-dessus pour calculer b mod 100000000003 avec-b*/bJ+3^T11J
. Cette fonction est définie commey
avecL
.Ensuite, je commence par l'entrée, puis je la porte à la dixième puissance et je réduis le mod 100000000003, et je répète cela 11 fois.
y^GT
est le code exécuté à chaque étape, et l'uy^GT11Q
exécute 11 fois en commençant par l'entrée.Maintenant, j'ai
Q^(10^11) mod 10^11 + 3
, et je veuxQ^(10^11 + 1) mod 10^11 + 3
, donc je multiplie par l'entrée avec*
, le réduit mod 100000000003y
une dernière fois, et la sortie.la source
Haskell ,
118113105101 octetsInspiré de cette solution .
-12 de Ørjan Johansen
Essayez-le en ligne!
Haskell , 48 octets
Une réécriture de cette solution . Bien que suffisamment rapide pour le vecteur de test, cette solution est trop lente pour les autres entrées.
Essayez-le en ligne!
la source
g
un opérateur(e?b)a s|...
(2) Si vous changeza
et ques
vous pouvez alors faire!
un non- opérateur et en ligney
. (3) Vous pouvez vous débarrasser du cherwhere
par unelast
astuce, au prix d'une duplicationz
. Essayez-le en ligne!|e==0=a
se débarrasse de cette duplication embêtante.Brachylog , 22 octets
Essayez-le en ligne!
Cela a pris environ 10 minutes
1000000
avec une version légèrement différente (et plus longue) du code qui était exactement deux fois plus rapide (vérifié uniquement les valeurs positivesİ
au lieu de positives et négatives). Par conséquent, cette opération devrait prendre environ 20 minutes.Explication
Nous décrivons simplement cela
Input × Output - 1 = 100000000003 × an integer
et laissons l'arithmétique des contraintesOutput
nous trouver .Techniquement, nous n'avons pas besoin de l'étiquetage explicite
≜
, mais si nous ne l'utilisons pas,~×
nous ne vérifierons pas le casN = [100000000003,1]
(car il est souvent inutile), ce qui signifie que cela sera très lent pour la saisie2
par exemple car il devra trouver le deuxième plus petit entier au lieu du premier.la source
İ
, donc c'est encore assez lent pour les gros produits.Python,
535149585349 octets-2 octets grâce à orlp
-2 octets grâce à officialaimm
-4 octets grâce à Felipe Nardi Batist
-3 octets grâce à isaacg
-1 octet grâce à Ørjan Johansen
-2 octets grâce à Federico Poloni
Essayez-le en ligne!
Il m'a fallu environ 30 minutes pour comprendre celui-ci. Ma solution est de commencer par le premier nombre qui passera à 1. Ce nombre est 1. Si son divisible par x, alors y est ce nombre divisé par x. Sinon, ajoutez 10000000003 à ce nombre pour trouver le deuxième nombre dont le mod 1000000003 sera égal à 1 et répétez.
la source
421385994
ce délai.b
qu'une seule fois, pourquoi ne pas le coder en dur?JavaScript (ES6),
153143141 octetsInspiré par cette réponse de math.stackexchange.com .
Une fonction récursive basée sur l'algorithme euclidien.
Modulo est implémenté en calculant:
Parce que le quotient est également nécessaire, le faire de cette façon est en fait logique.
Cas de test
Afficher l'extrait de code
la source
C ++ 11 (GCC / Clang, Linux),
104102 octetshttps://ideone.com/gp41rW
Non golfé, basé sur le théorème d'Euler et l'exponentation binaire.
la source
long
être qu'au moins 32 bits, il ne peut donc pas nécessairement tenir1e11 + 3
. C'est 32 bits sur Windows x86-64.long
est un type 64 bits sous Linux x86-64 (et d'autres systèmes d'exploitation qui utilisent le SystemV ABI). Donc, pour être entièrement portable, vous devez utiliserlong long
, qui est garanti au moins 64 bits depuis C ++ 11 .__int128_t
ne semble pas être C ++ standard, il semble que ce soit une extension gcc, ce serait cool si vous le déclariez comme un langage (C ++ 11 + gcc).Mathematica, 49 octets
la source
PHP, 71 octets
Cas de test
la source
Rubis , 58 octets
Utilise l'application isaacg du petit théorème de Fermat pour l'instant pendant que je termine le chronométrage de la solution de force brute.
Version actuelle force brute, qui est de 47 octets , mais
peut - êtreest trop lent:Essayez-le en ligne!
la source