Saya suka menganggap angka 10-adic sebagai angka yang bergerak tak terhingga ke kiri, atau modul integer dengan kekuatan 10 yang sangat besar.
Benda-benda terbawa tanpa batas ke kiri dan menghilang. Untuk melihat apa yang saya maksud, perhatikan itu...6667 * 3 = 1
di tanah 10-adic, karena "2" yang membawa ke kiri pergi hingga tak terbatas.
Penambahan dan penggandaan masuk akal untuk angka 10-adic, karena n
digit terakhir dari jumlah / produk hanya bergantung pada n
digit terakhir dari jumlah / multiplikasi.
Mengingat n
, Anda perlu mencetak n
digit terakhir dari akar kubus 10-adic dari 3, yaitu x
memuaskanx*x*x = 3
.
Ini berakhir:
...878683312291648481630318492665160423850087895134587
Kode Anda harus diakhiri n=1000
sebelum pengiriman.
Katakanlah jika angka yang Anda perlu cetak dimulai dengan nol, maka Anda tidak perlu mencetak angka nol di depannya, karena itu sebenarnya bukan titik untuk mencetak angka nol tambahan.
Ini adalah kode-golf . Jawaban terpendek dalam byte menang.
sumber
n=12
keluaran87895134587
bukannya087895134587
. Secara pribadi saya akan membuatnya opsional, karena itu akan membatalkan hampir semua jawaban ..Jawaban:
Python 2 , 33 byte
Cobalah online!
The
pow
Fungsi efisien menghitung eksponen modular3**(10**k*2/3+1)%10**k
.Kami diminta untuk menemukan solusi
r**3 = 3 (mod 10**k)
. Kami ingin menemukan eksponene
yang petanyax -> x**e
terbalik dengan cubingx -> x**3
working mod10**k
, sama seperti eksponen dekripsi dan enkripsi di RSA yang dibatalkan untuk menghasilkan nilai asli. Ini artinya(x**3)**e = x (mod 10**k)
untuk semuax
. (Kita akan mengasumsikan sepanjang itugcd(x,10) = 1
.) Lalu, kita bisa pulihr
dengan membalikkan cubing untuk mendapatkannyar = 3**e (mod 10**k)
.Memperluas
(r**3)**e = r (mod 10**k)
, kita dapatkanKami sedang mencari eksponen
3*e-1
yang menjamin bahwa melipatgandakan banyak salinan memberi kami1
.Modulo perkalian
10**k
membentuk grup untuk angka yang dapat dibalik, yaitu mereka yang memilikigcd(x,10) = 1
. Dengan Lagrange's Theorem, dix**c = 1
manac
adalah jumlah elemen dalam grup. Untuk modulo grupN
, penghitungan itu adalah nilai total Eulerφ(N)
, jumlah nilai dari1
hinggaN
yang relatif primaN
. Jadi, sudahr**φ(10**k) = 1 (mod 10**k)
. Oleh karena itu, cukup untuk3*e-1
menjadi kelipatanφ(10**k)
.Kami menghitung
Jadi, kami ingin
3*e-1
menjadi kelipatan4 * 10**(k-1)
Banyak pilihan yang dimungkinkan
r
, tetapir=5
memberikan ekspresi singkatdengan
e
nomor keseluruhan. Sebuah golf kecil menggunakan memendek lantai-divisie
untuk10**k*2/3+1
, dan mengekspresikanr = 3**e (mod 10**k)
memberikan hasil yang diinginkanr
.sumber
(r**3)**e = x (mod 10**k)
menjadi(r**3)**e = r (mod 10**k)
? Juga apakah itu hanya kebetulan saja(2 * 10**k + 1)/3 = 1/3 (mod 10**k)
?2
dengan nomor apa punx = 2 (mod 3)
Python 2 (PyPy) ,
5550 byte-5 byte terima kasih kepada @ HP Wiz !
Cobalah online!
Menghitung (non-bruteforcing) digit demi digit, jadi lebih cepat dari brute force.
Versi tanpa exec
Penjelasan
(Terima kasih @Leaky Nun dan @ user202729 untuk mencari tahu ini)
Pertama, amati bahwa itu
n**3
adalah involusi modulo 10 (yaitu jika fungsinya disebutf
, makaf(f(n)) == n
). Ini dapat dikonfirmasi menggunakan pencarian lengkap.Kita dapat menggunakan induksi matematika untuk menemukan digit berikutnya.
Membiarkan menjadi digit nomor urut (dari kanan).
dn
n
Sekarang, anggap kita tahu nomornya hingga
k
digit ke th,x
Kita tahu itu:
Mengganti ini dalam:
sumber
11
digit terakhir untukn=12
dann=13
.Bahasa Wolfram (Mathematica) , 21 byte
Cobalah online!
sumber
05AB1E ,
1713 bytePort of @ ASCII-only Python 2 (PyPy) menjawab .
-4 byte DAN bug-diperbaiki untuk output dengan nol terkemuka berkat @ Emigna , dengan mengganti
T%N°*+
denganθì
.Cobalah online.
Penjelasan:
sumber
T%N°*+
untukθì
bagi saya, dan nol 'memperbaiki' itu hanya bonus bagus dengan pendekatan ini.Java 8,
158156141136135 bytePort of @ ASCII-only Python 2 (PyPy) menjawab .
-2 byte terima kasih kepada @Neil .
-20 byte berkat hanya @ ASCII .
CATATAN: Sudah ada jawaban Java yang jauh lebih pendek oleh @ OlivierGrégoire menggunakan pendekatan algoritmik
modPow
.Cobalah online.
Penjelasan:
sumber
java.math.BigInteger u=null,r=u.valueOf(7),t=r;
?java.math.BigInteger t=null,r=u.valueOf(7);t=r;
awalnya sebelum saya menambahkanu
untuk menyimpan beberapa byte.Java (JDK 10) , 106 byte
Cobalah online!
Kredit
sumber
for(int l=0,d;++l<=n;
dan mengubahBigInteger I=null;
kevar I=new BigInteger("3");
mana kita dapat digunakan kembali.for(int l=0,d;l++<n;)
.dc , 15
Menggunakan eksponensial modular, seperti jawaban @ xnor .
Cobalah online!
TIO menghitung input = 1000 dalam 21d.
sumber
Pyth , 12
Cobalah online!
Sekali lagi, menggunakan eksponensial modular, seperti jawaban @ xnor .
sumber
Haskell , 37 byte
1 byte disimpan berkat ASCII-only!
Cobalah online!
Saya menggunakan pendekatan yang mirip dengan ASCII saja, tetapi saya menghindari menggunakan divisi
sumber
Pyth , 23 byte
Tentu saja, ini menggunakan pendekatan ASCII saja.
Coba di sini!
sumber
Arang ,
2622 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Inisialisasi hasilnya menjadi 7. (Tidak harus menjadi 7, tetapi 0 tidak berfungsi.)
Ulangi jumlah digit yang diperlukan.
Sekarang menggunakan pendekatan @ HPWiz untuk menghemat 4 byte.
Cetak hasilnya.
Berikut ini adalah versi brute-force 28-byte yang mengambil akar pangkat tiga dari nilai arbitrer:
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Input pertama adalah jumlah digit, kedua adalah nilai untuk di-root.
sumber
k
dengan daftar terbalik sebagai nomor basis 10.Base(Reverse(u), 10)
tetapi awalank
akan dikenakan biaya 4 byte saat melakukannya sebagai string hanya biaya 2 byte menghasilkan penghematan 1 byte setelahCast
memperhitungkannya.J , 33 byte
TIO
port jawaban @ ASCII saja tetapi menggunakan modulo tetap 10 ^ n seluruh
sumber
Jelly ,
231817 byteCobalah online!
Saya tahu
ƒ
akan bermanfaat.sumber