Calcola la norma p-adica di un numero razionale
Scrivi una funzione o un programma, che accetta 3 numeri interi m,n,p
(dove p
è un numero primo positivo) come input, che genera la norma p-adica (indicata da |m/n|_p
) come una frazione (completamente ridotta). Fermat è noto per avere solo margini molto piccoli, ma ciò che è piuttosto sconosciuto è che aveva solo uno schermo di computer molto piccolo. Quindi cerca di rendere il codice il più corto possibile affinché si adatti allo schermo di Fermat!
Definizione
Dato un numero primo p
, ogni frazione m/n
può essere scritta in modo univoco (ignorando i segni) in quanto (a/b)* p^e
tale e
è un numero intero e p
non divide né a
né né b
. La norma p-adica di m/n
è p^-e
. C'è un caso particolare, se la frazione è 0: |0|_p = 0
.
Il formato di output deve essere x/y
(ad esempio 1/3
; per numeri interi sono consentiti entrambi 10
o equivalentemente 10/1
, per numeri negativi deve essere presente un segno meno ad esempio -1/3
)
Dettagli
Il programma deve usare stdin / stdout o essere semplicemente costituito da una funzione che restituisce il numero o la stringa razionali. Devi supporre che l'input m/n
non sia completamente ridotto. Puoi presumere che p
sia un numero primo. Il programma deve essere in grado di elaborare numeri interi tra un -2^28
massimo di 2^28
e non dovrebbe richiedere più di 10 secondi.
Non sono consentite funzionalità integrate di fattorizzazione e controllo di base, così come conversazioni di base integrate e funzioni integrate che calcolano la valutazione o la norma p-adic.
Esempi (rubati da 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
interessante curiosità
(Non è necessario conoscere / leggere per questa sfida, ma forse bello da leggere come motivazione.)
(Per favore, correggimi se uso parole sbagliate o qualcos'altro non va, non sono abituato a parlarne in inglese.)
Se consideri i numeri razionali come un campo, allora la norma p-adica induce la metrica p-adica d_p(a,b) = |a-b|_p
. Quindi puoi completare questo campo per quanto riguarda questa metrica, ciò significa che puoi costruire un nuovo campo in cui convergono tutte le sequenze cauchy, che è una bella proprietà topologica da avere. (Che ad esempio i numeri razionali non hanno, ma i reali lo fanno.) Questi numeri p-adici sono, come avresti potuto immaginare, usati molto nella teoria dei numeri.
Un altro risultato interessante è il teorema di Ostrowski che sostanzialmente dice che qualsiasi valore assoluto (come definito di seguito) sui numeri razionali è uno dei tre seguenti:
- Il banale:
|x|=0 iff x=0, |x|=1 otherwise
- Lo standard (reale):
|x| = x if x>=0, |x| = -x if x<0
- Il p-adic (come lo abbiamo definito).
Un valore assoluto / una metrica è solo la generalizzazione di ciò che consideriamo una distanza . Un valore assoluto |.|
soddisfa le seguenti condizioni:
|x| >= 0 and |x|=0 if x=0
|xy| = |x| |y|
|x+y| <= |x|+|y|
Nota che puoi facilmente costruire metriche da valori assoluti e viceversa: |x| := d(0,x)
o d(x,y) := |x-y|
, quindi, sono quasi uguali se puoi aggiungere / sottrarre / moltiplicare (cioè in domini integrali). Ovviamente puoi definire una metrica su insiemi più generali, senza questa struttura.
|x|_11 = 11
, giusto? O va 11
bene? E deve gestire il x=0
caso?
x=0
caso e per questo esempio è possibile eseguire l'output 11
e anche 11/1
, ma non è necessario stampare |x|_11
.
PadicNorm
funzione di Mathematica sia fuori servizio? : P