Rasyonel bir sayının p-adik normunu hesaplayın


11

Rasyonel bir sayının p-adik normunu hesaplayın

Giriş olarak 3 tamsayıyı m,n,p( ppozitif bir asal olan) alan, |m/n|_p(tamamen azaltılmış) bir fraksiyon olarak p-adik normu (ile gösterilir ) çıktı veren bir fonksiyon veya program yazın . Fermat'ın sadece çok küçük marjları olduğu biliniyor, ancak bilinmeyen şey, sadece çok küçük bir bilgisayar ekranına sahip olması. Bu yüzden kodu Fermat'ın ekranına sığması için mümkün olduğunca kısa tutmaya çalışın!

Tanım

Bir asal Verilen pher fraksiyon m/nbenzersiz olarak (işaretleri görmezden) yazılabilir (a/b)* p^eböyle ebir tam sayıdır ve pböler ne ade b. P-adic normu ait m/nolan p^-e. Kesir 0 ise özel bir durum vardır: |0|_p = 0.

Çıktı formatı x/y(ör 1/3. Hem tamsayılar hem de 10eşdeğer 10/1olarak izin verilir, negatif sayılar için önde gelen eksi olmalıdır -1/3)

ayrıntılar

Program stdin / stdout kullanmalı veya sadece rasyonel sayı veya dizeyi döndüren bir işlevden oluşmalıdır. Girişin m/ntamamen azaltılmadığını varsaymalısınız . Bunun pasal olduğunu varsayabilirsiniz . Program, tamsayıları 10 saniyeye -2^28kadar işleyebilmeli 2^28ve 10 saniyeden fazla sürmemelidir.

Yerleşik çarpanlara ayırma ve prime kontrol işlevlerine ve yerleşik temel konuşmalara izin verilmez ve p-adik değerleme veya normu hesaplayan yerleşik işlevlere izin verilir.

Örnekler ( wikipedia'dan çalındı ):

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

İlginç bilgiler

(Bu meydan okumayı bilmek / okumak gerekmiyor, ama belki de motivasyon olarak okumak güzel.)

(Yanlış kelimeleri kullanırsam ya da başka bir şey yanlış olursa lütfen beni düzeltin, bu konuda İngilizce konuşmaya alışkın değilim.)

Rasyonel sayıları bir alan olarak görürseniz, p-adik norm p-adik metriğini indükler d_p(a,b) = |a-b|_p. Daha sonra bu alanı bu metriğe göre tamamlayabilirsiniz , yani tüm cauchy dizilerinin birleştiği yeni bir alan oluşturabilirsiniz, bu da sahip olmak güzel bir topolojik özelliktir. (Hangi rasyonel sayıların sahip olmadığı, fakat gerçeklerin sahip olduğu.) Bu p-adik sayılar tahmin edebileceğiniz gibi sayı teorisinde çok kullanılır.

Bir başka ilginç sonuç, Ostrowski'nin rasyonel sayılardaki (aşağıda tanımlandığı gibi) herhangi bir mutlak değerin aşağıdaki üçten biri olduğunu söyleyen teoremidir :

  • Önemsiz: |x|=0 iff x=0, |x|=1 otherwise
  • Standart (gerçek): |x| = x if x>=0, |x| = -x if x<0
  • P-adic (tanımladığımız gibi).

Mutlak değer / metrik , yalnızca mesafe olarak düşündüğümüz şeyin genelleştirilmesidir . Mutlak bir değer |.|aşağıdaki koşulları karşılar:

  • |x| >= 0 and |x|=0 if x=0
  • |xy| = |x| |y|
  • |x+y| <= |x|+|y|

Metrikleri mutlak değerlerden kolayca oluşturabileceğinizi |x| := d(0,x)veya bunun tersini yapabileceğinizi unutmayın: veya d(x,y) := |x-y|, / substract / multiply (yani integral alan adlarında) ekleyebiliyorsanız neredeyse aynıdır . Elbette bu yapı olmadan daha genel kümelerde bir metrik tanımlayabilirsiniz.


Mathematica'nın PadicNormişlevinin de bittiğini varsayıyorum ? : P
Alex A.

Doğru / ly olduğunu varsayıyorsunuz. (hangisi burada kullanılır?)
Kusur

İlginç Özellikler bölümü meydan okumayı tamamlamak için yararlı olmadıkça, ilgili taraflar için bu bilgilere bağlantı vermenin daha iyi olduğunu söyleyebilirim. Aksi takdirde, yazı gereksiz yere tıkar.
Alex A.

Sadece net olmak gerekirse, çıktı gibi bir şey olmalı |x|_11 = 11, değil mi? Yoksa 11iyi mi? Ve x=0davayı ele alması gerekiyor mu?
Glen O

@GlenO Doğru, bu işlemek zorunda mı x=0davayı ve bu örnek için çıkış olabilir 11sıra sıra 11/1fakat yazdırmak gerekmez |x|_11.
Kusur

Yanıtlar:


3

Julia, 94 80 75 bayt

f(m,n,p)=(k=gcd(m,n)
g(m)=m%p>0?g(m÷p)p:1
m!=0?print(g(n÷k),/,g(m÷k)):0)

Not: okunabilirlik için noktalı virgüllerin yerine satır beslemeleri kullanmak - her iki şekilde de çalışır.

Bu oldukça basit - g(m,n)fonksiyon Rekursif kalan (kullanır %çıkarmak için) p^ngirişinden faktörü mile, n=1standart olarak ve daha sonra çarpılır pçıkışı olacaktır, böylece, yineleme her adımında p^n. Kod n/gcd(m,n), bunu ve sonra m/gcd(m,n)uygun ifadeyi elde etmek için geçerlidir . karakterleri kaydetmek k=gcd(m,n)için gcd(m,n)iki kez hesaplanmasını önlemek için kullanılır . m!=0davanın ele alınacağı bir testtir x=0.

Çıkış formda olan N/1veya 1/Nuygun olarak Nbir p^e.


1

J, 35 34 bayt

(,'/'&,)&":/@(%+./)@(]<.^+.|.@])x:

Bu, Başbakanı psol argüman olarak ve diziyi m nsağ argüman olarak alan ikili bir fiildir . Her zaman eğik çizgiyi yazdırır /ve 0/1if değerini döndürür m = 0. Şöyle kullanın:

  f =: (,'/'&,)&":/@(%+./)@(]<.^+.|.@])x:
  5 f 63 550
25/1

açıklama

x:Genişletilmiş hassasiyet üzerindeki dönüşler, çünkü biz çok sayıda hallediyoruz. Kodun geri kalanı aşağıdaki gibi çalışır:

(,'/'&,)&":/@(%+./)@(]<.^+.|.@])
                        ^         Power: this gives the array p^n p^m
                         +.       Take element-wise GCD with
                           |.@]   the rotated array n m; this gives
                                  the largest powers of p that divide n and m
                      <.          Take element-wise minimum with
                     [            The array m n to handle the m=0 case correctly
              %+./                Divide this array by its GCD to get it to lowest terms
        &":/                      Convert both elements to strings
 ,'/'&,                           Insert the slash '/' between them


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.