Trouver la racine cubique 10-adique de 3


24

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 = 1dans 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 nchiffres de la somme / produit ne dépendent que des derniers nchiffres des sommets / multiplicandes.


Étant donné n, vous devez imprimer les derniers nchiffres de la racine cubique 10-adique de 3, c'est-à-dire xsatisfaisant x*x*x = 3.

Cela se termine:

...878683312291648481630318492665160423850087895134587

Votre code doit se terminer n=1000avant 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 . La réponse la plus courte en octets gagne.



1
Faut-il également imprimer les zéros non significatifs? La plupart des réponses (y compris ma réponse Java) échouent actuellement pour celles-ci. c'est-à-dire en n=12sortie 87895134587au lieu de 087895134587. Personnellement, je le
rendrais

@KevinCruijssen fait
Leaky Nun

Réponses:


26

Python 2 , 33 octets

lambda k:pow(3,10**k*2/3+1,10**k)

Essayez-le en ligne!

La powfonction calcule efficacement l'exposant modulaire 3**(10**k*2/3+1)%10**k.

On nous demande de trouver une solution r**3 = 3 (mod 10**k). Nous voulons trouver un exposant epour lequel la carte x -> x**eest inverse du cubing x -> x**3mod de travail 10**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 tous x. (Nous supposerons tout au long de cela gcd(x,10) = 1.) Ensuite, nous pouvons récupérer ren inversant le cubage pour obtenir r = 3**e (mod 10**k).

L'expansion (r**3)**e = r (mod 10**k), nous obtenons

r**(3*e-1) = 1 (mod 10**k)

Nous recherchons un exposant 3*e-1qui garantit la multiplication du nombre d'exemplaires 1.

Le module de multiplication 10**kforme un groupe de nombres inversibles, c'est-à-dire ceux avec gcd(x,10) = 1. Par le théorème de Lagrange, x**c = 1cest le nombre d'éléments dans le groupe. Pour le groupe modulo N, ce décompte est la valeur φ(N)du total d' Euler , le nombre de valeurs de 1à Nqui sont relativement premiers à N. Donc, nous l'avons r**φ(10**k) = 1 (mod 10**k). Par conséquent, il suffit 3*e-1d'être un multiple de φ(10**k).

Nous calculons

φ(10**k) = φ(5**k) φ(2**k)= 4 * 5**(k-1) * 2**(k-1) = 4 * 10**(k-1)`

Donc, nous voulons 3*e-1être un multiple de4 * 10**(k-1)

3*e - 1 = r * 4 * 10**(k-1)
e = (4r * 10**(k-1) + 1)/3

De nombreux choix sont possibles r, mais r=5donne l'expression courte

e = (2 * 10**k + 1)/3

avec eun nombre entier. Un peu jouer au golf en utilisant raccourcit-division du sol eà 10**k*2/3+1, et l' expression r = 3**e (mod 10**k)donne le résultat souhaité r.


1
J'aimerais voir une explication plus détaillée sur la façon dont cela fonctionne, très belle réponse!
Kritixi Lithos

Devrait l' (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)?
H.PWiz

@ H.PWiz Oui, merci, je l'ai corrigé. Je ne suis pas sûr que ce soit un inverse pour 3 est une coïncidence. Ce n'est certainement pas suffisant, car le remplacement du 2 par d'autres valeurs ne fonctionne pas.
xnor

@xnor Je pense que c'est suffisant. Vous devriez pouvoir remplacer pour remplacer 2par n'importe quel numérox = 2 (mod 3)
H.PWiz

Comme d'habitude, les maths gagnent!
Olivier Grégoire

18

Python 2 (PyPy) , 55 50 octets

-5 octets grâce à @HP Wiz !

n=p=1;exec"p*=10;n+=3*(3-n**3)%p;"*input();print n

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**3s'agit d'un modulo d'involution 10 (c'est-à-dire si la fonction est appelée f, alors f(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).dnn

d 1 3 ≡ 3 (mod 10)
 d 1 ≡ 3 3 (mod 10)
    ≡ 27 (mod 10)
    ≡ 7 (mod 10)

Supposons maintenant que nous connaissons le nombre jusqu'au ktroisième chiffre,x

              x 3 ≡ 3 (mod 10 k )
  (d k + 1 · 10 k + x) 3 ≡ 3 (mod 10 k + 1 )
3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 ) (expansion binomiale.)
(Notez que les deux autres termes peuvent être ignorés car ils sont 0 mod 10 k + 1 )
3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )

Nous savons que:

       x ≡ 7 (mod 10)
      x 2 ≡ 49 (mod 10)
         ≡ 9 (mod 10)
  x 2 · 10 k ≡ 9 · 10 k   (mod 10 k + 1 )
3 · x 2 · 10 k ≡ 27 · 10 k (mod 10 k + 1 )
         ≡ 7 · 10 k   (mod 10 k + 1 )

Substituant ceci dans:

3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )
  7 · d k + 1 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )
             d k + 1 ≡ (3 - x 3 ) ÷ (7 · 10 k ) (mod 10)
                 ≡ (3 - x 3 ) ÷ (7 · 10 k ) (mod 10)
           ∴ d k + 1 ≡ 3 · (3 - x 3 ) ÷ 10 k    (mod 10) (3 est l'inverse de 7 mod 10)

En fait, cette solution est susceptible d'être optimale. (pour la plupart des langues où la formule est moins verbeuse que le forçage brutal) Des explications peuvent être trouvées quelque part dans le chat , bien que très dispersées.
user202729


Cela n'imprime que les derniers 11chiffres de n=12et n=13.
Emigna

4
× et x sont très similaires dans certaines polices et rendent les calculs extrêmement difficiles à lire. Puis-je suggérer d'utiliser · (point central) au lieu de ×? (Et, évidemment, ce serait bien d' avoir MathJax ).
Peter Taylor



4

05AB1E , 17 13 octets

7IGD3mN°÷7*θì

Port 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:

7               # Start result-string `r` at '7'
IG              # Loop `N` in the range [1, input)
  D3m           #  `r` to the power 3
       ÷        #  Integer-divided with
     N°         #  10 to the power `N`
        7*      #  Multiplied by 7
          θì    #  Then take the last digit of this, and prepend it to the result `r`
                # Implicitly output result `r` after the loop

HPWiz a joué à mon approche, et le défi ne nécessite plus de zéros de tête afin que vous puissiez jouer au golf plus?
uniquement en ASCII

@ ASCII uniquement Peut-être, mais je ne sais pas comment. @Emigna a déjà joué au golf T%N°*+à θìmoi, et le zéro « fix » était juste un bonus agréable avec cette approche.
Kevin Cruijssen

4

Java 8, 158 156 141 141 136 135 octets

n->{var t=n.valueOf(3);var r=n.ONE;for(int i=0;i++<n.intValue();)r=r.add(t.subtract(r.pow(3)).multiply(t).mod(n.TEN.pow(i)));return r;}

Port 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:

n->{                            // Method with BigInteger as both parameter and return-type
  var t=n.valueOf(3);           //  Temp BigInteger with value 3
  var r=n.ONE;                  //  Result-BigInteger, starting at 1
  for(int i=0;i++<n.intValue();)//  Loop `i` in the range [1, n]
    r=r.add(                    //   Add to the result-BigDecimal:
       t.subtract(r.pow(3))     //    `t` subtracted with `r` to the power 3
       .multiply(t)             //    Multiplied by 3
       .mod(n.TEN.pow(i)));     //    Modulo by 10 to the power `i`
  return r;}                    //  Return the result-BigInteger

Oh, tu as aussi utilisé cet algorithme? Je reviendrai sur ma réponse et vous ajouterai des changements;)
Olivier Grégoire

java.math.BigInteger u=null,r=u.valueOf(7),t=r;?
Neil

@Neil Bien sûr .. merci. J'avais java.math.BigInteger t=null,r=u.valueOf(7);t=r;initialement avant d'ajouter le upour enregistrer quelques octets.
Kevin Cruijssen


1
* modpow, pas modpod: P
ASCII uniquement

4

Java (JDK 10) , 106 octets

n->n.valueOf(3).modPow(n.valueOf(2).multiply(n=n.TEN.pow(n.intValue())).divide(n.valueOf(3)).add(n.ONE),n)

Essayez-le en ligne!

Crédits


1
166 octets en changeant la boucle for(int l=0,d;++l<=n;et en changeant BigInteger I=null;à var I=new BigInteger("3");laquelle nous pouvons réutiliser.
Kevin Cruijssen

1
1 octet de plus à enregistrer en changeant la boucle en for(int l=0,d;l++<n;).
Kevin Cruijssen




1

Pyth , 23 octets

Bien sûr, cela utilise l'approche ASCII uniquement.

K7em=+K*%*7/^K3J^TdTJtU

Essayez-le ici!


1
@DigitalTrauma Oh> _ <Je jure que je n'ai pas remarqué votre réponse lol ... J'ai d'abord eu un portage de la solution ASCII, puis j'ai vu xnor et je l'ai porté directement au golf: PI suppose que je reviendrai à la révision initiale , bien que.
M. Xcoder

1

Fusain , 26 22 octets

≔⁷ηFN≧⁺﹪׳⁻³Xη³Xχ⊕ιηIη

Essayez-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.)

FN

Faites une boucle sur le nombre de chiffres requis.

        η       Current result.
       X ³     Take the cube. 
     ⁻³         Subtract from 3.
   ׳           Multiply by 3.
            ⊕ι  Increment the loop index.
          Xχ    Get that power of 10.
  ﹪             Modulo
≧⁺            η Add to the result.

Utilise désormais l'approche de @ HPWiz pour économiser 4 octets.

Iη

Imprimez le résultat.

Voici une version à force brute de 28 octets qui prend des racines cubiques de valeurs arbitraires:

FN⊞υ⊟Φχ¬﹪⁻XI⁺κ⭆⮌υμ³IηXχ⊕ι↓Iυ

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.


HPWiz a mis à jour (lire: golfé) mon approche. De plus, stringmap ne devrait plus être nécessaire puisque Leaky Nun a mis à jour les exigences. le premier lien pointe également vers la version en force brute> _>
ASCII uniquement

@ ASCII uniquement Merci, j'ai corrigé les liens et porté l'approche de HPWiz, mais j'avais besoin de StringMap pour concaténer kla liste inversée en tant que numéro de base 10.
Neil

Hmm. J'aurais pensé que le faire simplement comme un nombre peut être golfeur. Je suppose que non
ASCII seulement

@ ASCII uniquement Pour la version précédente que j'ai utilisée, Base(Reverse(u), 10)mais le préfixe kaurait 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 pris Casten compte le.
Neil

1

J , 33 octets

f=:3 :'((10x^y)|]+3*3-^&3)^:y 1x'

TIO

port de la réponse de @ ASCII uniquement, mais en utilisant le module fixe 10 ^ n tout au long


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.