Lubię myśleć o liczbie 10-adycznej jako liczbie, która idzie nieskończenie w lewo, lub o liczbach całkowitych o bardzo dużej potędze 10.
Rzeczy przenoszą się nieskończenie w lewo i znikają. Aby zobaczyć, co mam na myśli, zauważ, że ...6667 * 3 = 1
w krainie 10-adycznej, ponieważ „2”, które prowadzi w lewo, przechodzi w nieskończoność.
Dodawanie i mnożenie ma sens dla liczb 10-adycznych, ponieważ ostatnie n
cyfry sumy / iloczynu zależą tylko od ostatnich n
cyfr sum / mnożników.
Biorąc pod uwagę n
, musisz wydrukować ostatnie n
cyfry 10-adicowego pierwiastka sześcianu z 3, czyli x
satysfakcjonujące x*x*x = 3
.
Kończy się:
...878683312291648481630318492665160423850087895134587
Twój kod musi zostać zakończony n=1000
przed przesłaniem.
Powiedzmy, że jeśli liczba, którą chcesz wydrukować, zaczyna się od zera, to nie musisz drukować zer wiodących, ponieważ tak naprawdę nie jest to sens drukowania dodatkowych zer.
To jest golf golfowy . Najkrótsza odpowiedź w bajtach wygrywa.
źródło
n=12
generowanie87895134587
zamiast087895134587
. Osobiście uczyniłbym to opcjonalnym, ponieważ unieważniłoby prawie wszystkie odpowiedzi ..Odpowiedzi:
Python 2 , 33 bajty
Wypróbuj online!
pow
Funkcja efektywnie oblicza modułową wykładnik3**(10**k*2/3+1)%10**k
.Jesteśmy proszeni o znalezienie rozwiązania
r**3 = 3 (mod 10**k)
. Chcemy znaleźć wykładnik,e
dla którego mapax -> x**e
jest odwrotna dox -> x**3
działającego modu tworzenia kostek10**k
, podobnie jak wykładniki dekodowania i szyfrowania w RSA anulują się, aby uzyskać oryginalną wartość. Oznacza to, że(x**3)**e = x (mod 10**k)
dla wszystkichx
. (Założymy się przez cały czasgcd(x,10) = 1
.) Następnie możemy wyzdrowiećr
, odwracając kostkę, aby uzyskaćr = 3**e (mod 10**k)
.Rozwijamy się
(r**3)**e = r (mod 10**k)
, rozumiemySzukamy wykładnika,
3*e-1
który gwarantuje nam zwielokrotnienie liczby kopii1
.Modulo mnożenia
10**k
tworzy grupę dla liczb odwracalnych, czyli tych zgcd(x,10) = 1
. Według Twierdzenia Lagrange'a,x**c = 1
gdziec
jest liczba elementów w grupie. W przypadku modułu grupowegoN
liczba ta jest wartościąφ(N)
całkowitą Eulera , a liczba wartości od1
doN
jest względnie pierwszaN
. Więc mamyr**φ(10**k) = 1 (mod 10**k)
. Dlatego wystarczy3*e-1
być wielokrotnościąφ(10**k)
.Obliczamy
Chcemy
3*e-1
być wielokrotnością4 * 10**(k-1)
Możliwych jest wiele wyborów
r
, aler=5
daje to krótkie wyrażeniez
e
liczbą całkowitą. Trochę gry w golfa za pomocą podziału podłogi skracae
się10**k*2/3+1
, a wyrażanier = 3**e (mod 10**k)
daje pożądany rezultatr
.źródło
(r**3)**e = x (mod 10**k)
być(r**3)**e = r (mod 10**k)
? Czy to tylko zbieg okoliczności, że(2 * 10**k + 1)/3 = 1/3 (mod 10**k)
?2
dowolnym numeremx = 2 (mod 3)
Python 2 (PyPy) ,
5550 bajtów-5 bajtów dzięki @HP Wiz !
Wypróbuj online!
Oblicza (nie brutalnie) cyfra po cyfrze, więc jest szybsza niż brutalna siła.
Wersja bez exec
Wyjaśnienie
(Dzięki @Leaky Nun i @ user202729 za zrozumienie tego)
Najpierw zauważ, że
n**3
jest to moduł inwolucji 10 (tzn. Jeśli funkcja zostanie wywołanaf
, tof(f(n)) == n
). Można to potwierdzić za pomocą wyczerpującego wyszukiwania.Możemy użyć indukcji matematycznej, aby znaleźć następną cyfrę.
Niech będzie trzecią cyfrą liczby (od prawej).
dn
n
Załóżmy, że znamy liczbę aż do
k
cyfry th,x
Wiemy to:
Podstawiając to w:
źródło
11
cyfry dlan=12
in=13
.Wolfram Language (Mathematica) , 21 bajtów
Wypróbuj online!
źródło
05AB1E ,
1713 bajtówPort odpowiedzi @ Python 2 (PyPy) tylko dla ASCII .
-4 bajtów i bug-ustalony dla wyjść z zerem na początku, dzięki @Emigna , zastępując
T%N°*+
zθì
.Wypróbuj online.
Wyjaśnienie:
źródło
T%N°*+
doθì
mnie, a zerem „fix” był po prostu miły bonus z tego podejścia.Java 8,
158156141136135 bajtówPort odpowiedzi @ Python 2 (PyPy) tylko dla ASCII .
-2 bajty dzięki @Neil .
-20 bajtów dzięki tylko @ ASCII .
UWAGA: Odpowiedź Javy na @ OlivierGrégoire jest już znacznie krótsza przy użyciu algorytmu
modPow
.Wypróbuj online.
Wyjaśnienie:
źródło
java.math.BigInteger u=null,r=u.valueOf(7),t=r;
?java.math.BigInteger t=null,r=u.valueOf(7);t=r;
początku dodałem,u
aby zaoszczędzić trochę bajtów.Java (JDK 10) , 106 bajtów
Wypróbuj online!
Kredyty
źródło
for(int l=0,d;++l<=n;
i zmieniając,BigInteger I=null;
dovar I=new BigInteger("3");
którego możemy ponownie użyć.for(int l=0,d;l++<n;)
.dc , 15
Wykorzystuje potęgowanie modułowe, takie jak odpowiedź @ xnor .
Wypróbuj online!
TIO oblicza dane wejściowe = 1000 w 21s.
źródło
Pyth , 12
Wypróbuj online!
Ponownie, stosując modułowe potęgowanie, jak odpowiedź @ xnor .
źródło
Haskell , 37 bajtów
1 bajt zapisany dzięki tylko ASCII!
Wypróbuj online!
Używam podobnego podejścia do ASCII, ale unikam dzielenia
źródło
Pyth , 23 bajty
Oczywiście wykorzystuje to podejście tylko ASCII.
Wypróbuj tutaj!
źródło
Węgiel drzewny ,
2622 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Zainicjuj wynik na 7. (Nie musi to być 7, ale 0 nie działa.)
Zapętlaj liczbę wymaganych cyfr.
Teraz wykorzystuje podejście @ HPWiz do zapisania 4 bajtów.
Wydrukuj wynik.
Oto 28-bajtowa wersja brute-force, która bierze pierwiastki z dowolnych wartości:
Wypróbuj online! Link jest do pełnej wersji kodu. Pierwsze wejście to liczba cyfr, drugie to wartość do zrootowania.
źródło
k
z odwróconą listą jako liczbę podstawową 10.Base(Reverse(u), 10)
ale prefiksk
miałby kosztować 4 bajty, podczas gdy robienie tego jako łańcucha kosztuje tylko 2 bajty, co daje 1-bajtową oszczędność poCast
uwzględnieniu.J , 33 bajty
TIO
port @ ASCII tylko na odpowiedź , ale stosując stałe modulo 10 ^ n całym
źródło
Galaretka ,
231817 bajtówWypróbuj online!
Wiem,
ƒ
że się przyda.źródło