Ich stelle mir eine 10-adische Zahl gerne als eine Zahl vor, die unendlich nach links geht, oder ein ganzzahliges Modulo, eine sehr sehr große Potenz von 10.
Dinge tragen unendlich nach links und verschwinden. Um zu sehen, was ich meine, beachten Sie, dass ...6667 * 3 = 1
im 10-adischen Land, da die "2", die nach links trägt, ins Unendliche geht.
Addition und Multiplikation sind für 10-adische Zahlen sinnvoll, da die letzten n
Stellen der Summe / des Produkts nur von den letzten n
Stellen der Summanden / Multiplikanden abhängen .
Dazu n
müssen Sie die letzten n
Ziffern der 10-adischen x
Kubikwurzel von 3 ausgeben , also befriedigend x*x*x = 3
.
Es endet:
...878683312291648481630318492665160423850087895134587
Ihr Code muss vor der Übermittlung für enden n=1000
.
Nehmen wir an, wenn die zu druckende Zahl mit Null beginnt, brauchen Sie die führenden Nullen nicht zu drucken, da dies nicht der eigentliche Punkt ist, um zusätzliche Nullen zu drucken.
Das ist Code-Golf . Kürzeste Antwort in Bytes gewinnt.
quelle
n=12
ausgeben87895134587
statt087895134587
. Persönlich würde ich es optional machen, da es fast alle Antworten ungültig machen würde.Antworten:
Python 2 , 33 Bytes
Probieren Sie es online!
Die
pow
Funktion berechnet effizient den modularen Exponenten3**(10**k*2/3+1)%10**k
.Wir werden gebeten, eine Lösung zu finden
r**3 = 3 (mod 10**k)
. Wir wollen einen Exponenten finden,e
für den die Mapx -> x**e
umgekehrt zu Cubingx -> x**3
Working Mod ist10**k
, genau wie die Entschlüsselungs- und Verschlüsselungsexponenten in RSA aufheben, um den ursprünglichen Wert zu erzeugen. Das bedeutet das(x**3)**e = x (mod 10**k)
für allex
. (Wir nehmen das angcd(x,10) = 1
.) Dann können wir uns erholen,r
indem wir den Würfel umkehren, um zu erhaltenr = 3**e (mod 10**k)
.Wenn
(r**3)**e = r (mod 10**k)
wir uns ausdehnen , bekommen wirWir suchen einen Exponenten
3*e-1
, der garantiert, dass wir so viele Kopien multiplizieren können1
.Das Multiplikationsmodulo
10**k
bildet eine Gruppe für invertierbare Zahlen, also solche mitgcd(x,10) = 1
. Nach dem Satz von Lagrange,x**c = 1
woc
ist die Anzahl der Elemente in der Gruppe. Für die Gruppe ModuloN
ist diese Anzahl der Euler-Totientenwertφ(N)
, die Anzahl der Werte von1
bisN
ist relativ hochN
. Also haben wirr**φ(10**k) = 1 (mod 10**k)
. Daher ist es ausreichend3*e-1
, ein Vielfaches von zu seinφ(10**k)
.Wir rechnen
Wir wollen
3*e-1
also ein Vielfaches von sein4 * 10**(k-1)
Viele Auswahlmöglichkeiten stehen zur Verfügung
r
, geben aberr=5
den kurzen Ausdruckmit
e
einer ganzen Zahl. Ein wenig Golf mit boden Division kürzte
auf10**k*2/3+1
, und mit dem Ausdruckr = 3**e (mod 10**k)
gibt das gewünschte Ergebnisr
.quelle
(r**3)**e = x (mod 10**k)
sein(r**3)**e = r (mod 10**k)
? Auch ist es nur ein Zufall, dass(2 * 10**k + 1)/3 = 1/3 (mod 10**k)
?2
beliebige Nummer zu ersetzenx = 2 (mod 3)
Python 2 (PyPy) ,
55-50Bytes-5 Bytes dank @HP Wiz !
Probieren Sie es online!
Berechnet Ziffer für Ziffer (ohne Brute-Forcing), ist also schneller als Brute-Force.
Version ohne exec
Erläuterung
(Danke @Leaky Nun und @ user202729 , dass Sie das herausgefunden haben)
Beobachten Sie zunächst, dass dies
n**3
ein Involution Modulo 10 ist (dh, wenn die Funktion aufgerufen wirdf
, dannf(f(n)) == n
). Dies kann durch eine umfassende Suche bestätigt werden.Wir können mathematische Induktion verwenden, um die nächste Ziffer zu finden.
Sei die dritte Ziffer der Zahl (von rechts).
dn
n
Angenommen, wir kennen die Zahl bis zur
k
vierten Ziffer.x
Wir wissen das:
Einsetzen in:
quelle
11
Ziffern fürn=12
undn=13
.Wolfram Language (Mathematica) , 21 Byte
Probieren Sie es online!
quelle
05AB1E ,
1713 BytesPort der Python 2 (PyPy) -Antwort von @ ASCII-only .
-4 Byte UND Bugfix für Ausgaben mit führenden Nullen dank @Emigna , durch Ersetzen
T%N°*+
durchθì
.Probieren Sie es online aus.
Erläuterung:
quelle
T%N°*+
aufθì
für mich, und die führende Null ‚fix‘ war nur ein netter Bonus mit diesem Ansatz.Java 8,
158156141136135 BytesPort der Python 2 (PyPy) -Antwort von @ ASCII-only .
-2 Bytes dank @Neil .
-20 Bytes dank nur @ ASCII .
HINWEIS: Es gibt bereits eine viel kürzere Java-Antwort von @ OlivierGrégoire unter Verwendung eines algorithmischen Ansatzes
modPow
.Probieren Sie es online aus.
Erläuterung:
quelle
java.math.BigInteger u=null,r=u.valueOf(7),t=r;
?java.math.BigInteger t=null,r=u.valueOf(7);t=r;
anfangs vorher das hinzugefügtu
, um ein paar Bytes zu sparen.Java (JDK 10) , 106 Byte
Probieren Sie es online!
Credits
quelle
for(int l=0,d;++l<=n;
und Ändern,BigInteger I=null;
aufvar I=new BigInteger("3");
die wir wiederverwenden können.for(int l=0,d;l++<n;)
.dc , 15
Verwendet modulare Exponentiation, wie die Antwort von @ xnor .
Probieren Sie es online!
TIO berechnet die Eingabe = 1000 in 21s.
quelle
Pyth , 12
Probieren Sie es online!
Wieder mit modularer Exponentiation, wie @ xnors Antwort .
quelle
Haskell , 37 Bytes
Dank nur ASCII 1 Byte gespart!
Probieren Sie es online!
Ich benutze einen ähnlichen Ansatz wie nur ASCII, aber ich vermeide die Division
quelle
Pyth , 23 Bytes
Dabei wird natürlich nur der ASCII-Ansatz verwendet.
Probieren Sie es hier aus!
quelle
Holzkohle ,
2622 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Initialisiere das Ergebnis auf 7. (Muss nicht 7 sein, aber 0 funktioniert nicht.)
Durchlaufen Sie die Anzahl der erforderlichen Stellen.
Verwendet jetzt den Ansatz von @ HPWiz, um 4 Bytes zu sparen.
Drucken Sie das Ergebnis.
Hier ist eine 28-Byte-Brute-Force-Version, die Kubikwurzeln beliebiger Werte verwendet:
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Die erste Eingabe ist die Anzahl der Stellen, die zweite ist der Wert für root.
quelle
k
um die umgekehrte Liste als Basis-10-Zahl zu verknüpfen .Base(Reverse(u), 10)
, hat das Präfixk
jedoch 4 Byte gekostet, während es als Zeichenfolge nur 2 Byte kostet, was zu einer Einsparung von 1 Byte nachCast
Berücksichtigung von führt.J , 33 Bytes
TIO
Port der Antwort von @ ASCII-only, aber durchgehend mit festem Modulo 10 ^ n
quelle
Jelly ,
231817 BytesProbieren Sie es online!
Ich weiß,
ƒ
wird nützlich sein.quelle