Hitung norma p-adic dari bilangan rasional
Tulis fungsi atau program, yang mengambil 3 bilangan bulat m,n,p
(di mana p
bilangan prima positif) sebagai input, yang menampilkan norma p-adic (dilambangkan dengan |m/n|_p
) sebagai fraksi (dikurangi sepenuhnya). Fermat diketahui hanya memiliki margin yang sangat kecil, tetapi yang agak tidak diketahui adalah bahwa ia hanya memiliki layar komputer yang sangat kecil. Jadi cobalah untuk membuat kode sesingkat mungkin agar muat di layar Fermat!
Definisi
Diberi bilangan prima p
, setiap fraksi m/n
dapat ditulis secara unik (mengabaikan tanda-tanda) dengan (a/b)* p^e
demikian e
adalah bilangan bulat dan p
tidak membagi a
juga b
. The norma p-adic dari m/n
adalah p^-e
. Ada kasus khusus, jika fraksi adalah 0: |0|_p = 0
.
Format output harus x/y
(misalnya 1/3
; untuk bilangan bulat keduanya 10
atau yang setara 10/1
diizinkan, untuk bilangan negatif harus ada minus minus terkemuka -1/3
)
Detail
Program harus menggunakan stdin / stdout, atau hanya terdiri dari fungsi yang mengembalikan bilangan rasional atau string. Anda harus berasumsi bahwa input m/n
tidak sepenuhnya berkurang. Anda dapat berasumsi bahwa p
itu prima. Program harus dapat memproses bilangan bulat antara -2^28
hingga 2^28
, dan tidak boleh lebih dari 10 detik.
Internalisasi faktorisasi dan fungsionalitas pemeriksaan prima tidak diperbolehkan, serta basis percakapan bawaan, dan fungsi internal yang menghitung penilaian atau norma p-adic.
Contoh (dicuri dari wikipedia ):
x = m/n = 63/550 = 2^-1 * 3^2 * 5^-2 * 7 * 11^-1
|x|_2 = 2
|x|_3 = 1/9
|x|_5 = 25
|x|_7 = 1/7
|x|_11 = 11
|x|_13 = 1
Hal- hal sepele yang menarik
(Tidak perlu tahu / membaca untuk tantangan ini, tetapi mungkin baik untuk dibaca sebagai motivasi.)
(Tolong koreksi saya jika saya menggunakan kata-kata yang salah, atau ada yang salah, saya tidak terbiasa membicarakan hal ini dalam bahasa Inggris.)
Jika Anda menganggap bilangan rasional sebagai bidang, maka norma p-adic menginduksi metrik p-adic d_p(a,b) = |a-b|_p
. Kemudian Anda dapat menyelesaikan bidang ini terkait dengan metrik ini, itu berarti Anda dapat membangun bidang baru tempat semua urutan cauchy bertemu, yang merupakan properti topologi yang bagus untuk dimiliki. (Yang misalnya bilangan rasional tidak memiliki, tetapi real memiliki.) Bilangan p-adik ini seperti yang Anda duga, banyak digunakan dalam teori bilangan.
Hasil lain yang menarik adalah teorema Ostrowski yang pada dasarnya mengatakan, setiap nilai absolut (sebagaimana didefinisikan di bawah) pada bilangan rasional adalah salah satu dari tiga berikut:
- Sepele:
|x|=0 iff x=0, |x|=1 otherwise
- Standar (nyata):
|x| = x if x>=0, |x| = -x if x<0
- P-adic (seperti yang kita definisikan).
Nilai absolut / metrik hanyalah generalisasi dari apa yang kami anggap sebagai jarak . Nilai absolut |.|
memenuhi persyaratan berikut:
|x| >= 0 and |x|=0 if x=0
|xy| = |x| |y|
|x+y| <= |x|+|y|
Perhatikan bahwa Anda dapat dengan mudah membuat metrik dari nilai absolut dan sebaliknya: |x| := d(0,x)
atau d(x,y) := |x-y|
, sehingga hampir sama jika Anda dapat menambah / mengurangi / melipatgandakan (yang ada dalam domain integral). Anda tentu saja dapat mendefinisikan metrik pada set yang lebih umum, tanpa struktur ini.
PadicNorm
fungsi Mathematica juga keluar? : P|x|_11 = 11
, kan? Atau11
baik - baik saja? Dan apakah itu harus menanganix=0
kasus ini?x=0
dan untuk contoh ini Anda bisa keluaran11
juga11/1
, tetapi Anda tidak harus mencetak|x|_11
.Jawaban:
Julia,
948075 byteCatatan: menggunakan linefeeds sebagai pengganti titik koma untuk keterbacaan - akan bekerja dengan cara yang sama.
Ini cukup sederhana -
g(m,n)
fungsi menggunakan rekursi dan sisa (%
) untuk mengekstraksip^n
faktor dari inputm
, dengann=1
sebagai default dan kemudian dikalikan denganp
pada setiap langkah rekursi, sehingga output akan menjadip^n
. Kode berlaku untukn/gcd(m,n)
, dan kemudianm/gcd(m,n)
untuk mendapatkan ekspresi yang sesuai.k=gcd(m,n)
digunakan untuk menghindari penghitungangcd(m,n)
dua kali, untuk menyimpan karakter.m!=0
adalah ujian untuk menangani kasus di manax=0
.Output adalah dalam bentuk
N/1
atau1/N
yang sesuai, di manaN
adalahp^e
.sumber
J,
3534 byteIni adalah kata kerja biner yang menggunakan bilangan prima
p
sebagai argumen kirinya, dan arraym n
sebagai argumen kanannya. Itu selalu mencetak garis miring/
, dan mengembalikan0/1
jikam = 0
. Gunakan seperti ini:Penjelasan
The
x:
bergantian pada presisi diperpanjang, karena kita sedang menangani jumlah yang sangat besar. Sisa kode berfungsi sebagai berikut:sumber
CJam, 42 byte
Ini selesai dengan kesalahan (setelah mencetak 0) untuk input 0. Cobalah online di interpreter CJam .
sumber
Stax , 32 byte
Jalankan dan debug itu
Seharusnya bisa membuatnya lebih pendek. Dukungan asli untuk fraksi oleh Stax cukup rapi.
Setara ASCII:
sumber