J'aime à penser à un nombre 10-adique comme un nombre qui va infiniment vers la gauche, ou à un module entier une très très grande puissance de 10.
Les choses portent infiniment vers la gauche et disparaissent. Pour voir ce que je veux dire, notons que ...6667 * 3 = 1
dans le pays 10-adique, puisque le "2" qui porte vers la gauche va à l'infini.
L'addition et la multiplication ont un sens pour les nombres 10-adiques, car les derniers n
chiffres de la somme / produit ne dépendent que des derniers n
chiffres des sommets / multiplicandes.
Étant donné n
, vous devez imprimer les derniers n
chiffres de la racine cubique 10-adique de 3, c'est-à-dire x
satisfaisant x*x*x = 3
.
Cela se termine:
...878683312291648481630318492665160423850087895134587
Votre code doit se terminer n=1000
avant la soumission.
Disons que si le nombre que vous devez imprimer commence par zéro, vous n'avez pas besoin d'imprimer les zéros de tête, car ce n'est pas vraiment le point d'imprimer des zéros supplémentaires.
C'est du code-golf . La réponse la plus courte en octets gagne.
la source
n=12
sortie87895134587
au lieu de087895134587
. Personnellement, je leRéponses:
Python 2 , 33 octets
Essayez-le en ligne!
La
pow
fonction calcule efficacement l'exposant modulaire3**(10**k*2/3+1)%10**k
.On nous demande de trouver une solution
r**3 = 3 (mod 10**k)
. Nous voulons trouver un exposante
pour lequel la cartex -> x**e
est inverse du cubingx -> x**3
mod de travail10**k
, tout comme les exposants de déchiffrement et de chiffrement dans RSA annulent pour produire la valeur d'origine. Cela signifie que(x**3)**e = x (mod 10**k)
pour tousx
. (Nous supposerons tout au long de celagcd(x,10) = 1
.) Ensuite, nous pouvons récupérerr
en inversant le cubage pour obtenirr = 3**e (mod 10**k)
.L'expansion
(r**3)**e = r (mod 10**k)
, nous obtenonsNous recherchons un exposant
3*e-1
qui garantit la multiplication du nombre d'exemplaires1
.Le module de multiplication
10**k
forme un groupe de nombres inversibles, c'est-à-dire ceux avecgcd(x,10) = 1
. Par le théorème de Lagrange,x**c = 1
oùc
est le nombre d'éléments dans le groupe. Pour le groupe moduloN
, ce décompte est la valeurφ(N)
du total d' Euler , le nombre de valeurs de1
àN
qui sont relativement premiers àN
. Donc, nous l'avonsr**φ(10**k) = 1 (mod 10**k)
. Par conséquent, il suffit3*e-1
d'être un multiple deφ(10**k)
.Nous calculons
Donc, nous voulons
3*e-1
être un multiple de4 * 10**(k-1)
De nombreux choix sont possibles
r
, maisr=5
donne l'expression courteavec
e
un nombre entier. Un peu jouer au golf en utilisant raccourcit-division du sole
à10**k*2/3+1
, et l' expressionr = 3**e (mod 10**k)
donne le résultat souhaitér
.la source
(r**3)**e = x (mod 10**k)
être(r**3)**e = r (mod 10**k)
? Est-ce aussi juste une coïncidence(2 * 10**k + 1)/3 = 1/3 (mod 10**k)
?2
par n'importe quel numérox = 2 (mod 3)
Python 2 (PyPy) ,
5550 octets-5 octets grâce à @HP Wiz !
Essayez-le en ligne!
Calcule (non-bruteforcing) chiffre par chiffre, donc c'est plus rapide que la force brute.
Version sans exec
Explication
(Merci @Leaky Nun et @ user202729 d' avoir compris cela)
Tout d'abord, observez qu'il
n**3
s'agit d'un modulo d'involution 10 (c'est-à-dire si la fonction est appeléef
, alorsf(f(n)) == n
). Cela peut être confirmé à l'aide d'une recherche exhaustive.Nous pouvons utiliser l'induction mathématique pour trouver le chiffre suivant.
Soit le e chiffre du nombre (à partir de la droite).
dn
n
Supposons maintenant que nous connaissons le nombre jusqu'au
k
troisième chiffre,x
Nous savons que:
Substituant ceci dans:
la source
11
chiffres den=12
etn=13
.Wolfram Language (Mathematica) , 21 octets
Essayez-le en ligne!
la source
05AB1E ,
1713 octetsPort de la réponse Python 2 (PyPy) de @ ASCII uniquement .
-4 octets ET correction de bogue pour les sorties avec des zéros non significatifs grâce à @Emigna , en remplaçant
T%N°*+
parθì
.Essayez-le en ligne.
Explication:
la source
T%N°*+
àθì
moi, et le zéro « fix » était juste un bonus agréable avec cette approche.Java 8,
158156141 141136135 octetsPort de la réponse Python 2 (PyPy) de @ ASCII uniquement .
-2 octets grâce à @Neil .
-20 octets grâce à @ ASCII uniquement .
NOTE: Il y a déjà une réponse Java beaucoup plus courte par @ OlivierGrégoire utilisant une approche algorithmique utilisant
modPow
.Essayez-le en ligne.
Explication:
la source
java.math.BigInteger u=null,r=u.valueOf(7),t=r;
?java.math.BigInteger t=null,r=u.valueOf(7);t=r;
initialement avant d'ajouter leu
pour enregistrer quelques octets.Java (JDK 10) , 106 octets
Essayez-le en ligne!
Crédits
la source
for(int l=0,d;++l<=n;
et en changeantBigInteger I=null;
àvar I=new BigInteger("3");
laquelle nous pouvons réutiliser.for(int l=0,d;l++<n;)
.dc , 15
Utilise l'exponentiation modulaire, comme la réponse de @ xnor .
Essayez-le en ligne!
TIO calcule l'entrée = 1000 en 21 s.
la source
Pyth , 12
Essayez-le en ligne!
Encore une fois, en utilisant l'exponentiation modulaire, comme la réponse de @ xnor .
la source
Haskell , 37 octets
1 octet enregistré grâce à ASCII uniquement!
Essayez-le en ligne!
J'utilise une approche similaire à ASCII uniquement, mais j'évite d'utiliser la division
la source
Pyth , 23 octets
Bien sûr, cela utilise l'approche ASCII uniquement.
Essayez-le ici!
la source
Fusain ,
2622 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Initialisez le résultat à 7. (ne doit pas nécessairement être 7, mais 0 ne fonctionne pas.)
Faites une boucle sur le nombre de chiffres requis.
Utilise désormais l'approche de @ HPWiz pour économiser 4 octets.
Imprimez le résultat.
Voici une version à force brute de 28 octets qui prend des racines cubiques de valeurs arbitraires:
Essayez-le en ligne! Le lien est vers la version détaillée du code. La première entrée est le nombre de chiffres, la seconde est la valeur à la racine.
la source
k
la liste inversée en tant que numéro de base 10.Base(Reverse(u), 10)
mais le préfixek
aurait coûté 4 octets alors que le faire en tant que chaîne ne coûte que 2 octets, ce qui entraînerait une économie de 1 octet après avoir prisCast
en compte le.J , 33 octets
TIO
port de la réponse de @ ASCII uniquement, mais en utilisant le module fixe 10 ^ n tout au long
la source
Gelée ,
231817 octetsEssayez-le en ligne!
Je sais que ce
ƒ
sera utile.la source