Tính chỉ tiêu p-adic của một số hữu tỷ


11

Tính chỉ tiêu p-adic của một số hữu tỷ

Viết hàm hoặc chương trình, lấy 3 số nguyên m,n,p(trong đó plà số nguyên tố dương) làm đầu vào, đưa ra định mức p-adic (ký hiệu là |m/n|_p) dưới dạng phân số (giảm hoàn toàn). Fermat được biết là chỉ có lợi nhuận rất nhỏ, nhưng điều chưa biết là anh ta chỉ có một màn hình máy tính rất nhỏ. Vì vậy, hãy cố gắng làm cho mã càng ngắn càng tốt để nó phù hợp với màn hình của Fermat!

Định nghĩa

Cho một số nguyên tố p, mọi phân số m/ncó thể được viết duy nhất (bỏ qua các dấu) vì (a/b)* p^eđó elà một số nguyên và pchia acũng không b. Các chuẩn mực p-adic của m/np^-e. Có một trường hợp đặc biệt, nếu phân số là 0 : |0|_p = 0.

Định dạng đầu ra phải là x/y(ví dụ: 1/3đối với các số nguyên cả hai 10hoặc tương đương 10/1đều được phép, đối với các số âm phải có một dấu trừ hàng đầu, ví dụ -1/3)

Chi tiết

Chương trình phải sử dụng stdin / stdout hoặc chỉ bao gồm một hàm trả về số hoặc chuỗi hợp lý. Bạn phải giả định rằng đầu vào m/nkhông được giảm hoàn toàn. Bạn có thể cho rằng đó plà một nguyên tố. Chương trình phải có khả năng xử lý các số nguyên giữa -2^28tối đa 2^28và không mất quá 10 giây.

Các chức năng kiểm tra chính và nhân tố được xây dựng không được phép, cũng như được xây dựng trong hội thoại cơ sở và được xây dựng theo chức năng tính toán định giá hoặc định mức p-adic.

Ví dụ (bị đánh cắp từ 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

Câu đố thú vị

(Không cần thiết phải biết / đọc cho thử thách này, nhưng có lẽ rất hay để đọc như một động lực.)

(Vui lòng sửa lại cho tôi nếu tôi sử dụng các từ sai, hoặc có gì đó sai, tôi không quen nói về điều này bằng tiếng Anh.)

Nếu bạn coi các số hữu tỷ là một trường, thì chỉ tiêu p-adic tạo ra số liệu p-adic d_p(a,b) = |a-b|_p. Sau đó, bạn có thể hoàn thành trường này liên quan đến số liệu này, điều đó có nghĩa là bạn có thể xây dựng một trường mới nơi tất cả các chuỗi khó hiểu hội tụ, đây là một thuộc tính tô pô đẹp. (Ví dụ, số hữu tỷ không có, nhưng số thực thì có.) Những số p-adic này như bạn có thể đoán, được sử dụng rất nhiều trong lý thuyết số.

Một kết quả thú vị khác là định lý của Ostrowski về cơ bản nói rằng, bất kỳ giá trị tuyệt đối nào (như được định nghĩa dưới đây) trên các số hữu tỷ là một trong ba điều sau đây:

  • Tầm thường: |x|=0 iff x=0, |x|=1 otherwise
  • Tiêu chuẩn (thực tế): |x| = x if x>=0, |x| = -x if x<0
  • P-adic (như chúng tôi đã định nghĩa nó).

Một giá trị tuyệt đối / một số liệu chỉ là sự khái quát hóa những gì chúng ta coi là khoảng cách . Một giá trị tuyệt đối |.|thỏa mãn các điều kiện sau:

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

Lưu ý rằng bạn có thể dễ dàng xây dựng các số liệu từ các giá trị tuyệt đối và ngược lại: |x| := d(0,x)hoặc d(x,y) := |x-y|, vì vậy chúng gần như giống nhau nếu bạn có thể thêm / trừ / nhân (đó là trong các miền tích phân). Tất nhiên bạn có thể định nghĩa một số liệu trên các bộ tổng quát hơn, không có cấu trúc này.


Tôi giả sử PadicNormchức năng của Mathicala cũng bị loại? : P
Alex A.

Bạn giả sử đúng / ly. (cái nào được sử dụng ở đây?)
flawr

Trừ khi phần Thuộc tính thú vị hữu ích để hoàn thành thử thách, tôi sẽ nói tốt hơn là chỉ liên kết đến thông tin đó cho các bên quan tâm. Nếu không, nó không cần thiết làm lộn xộn bài.
Alex A.

Chỉ cần rõ ràng, đầu ra nên là một cái gì đó như thế |x|_11 = 11, phải không? Hay là 11tốt? Và nó có phải xử lý x=0vụ việc không?
Glen O

@GlenO Đúng, nó có để xử lý các x=0tình huống và ví dụ này, bạn có thể sản lượng 11cũng như 11/1, nhưng bạn không cần phải in |x|_11.
flawr

Câu trả lời:


3

Julia, 94 80 75 byte

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)

Lưu ý: sử dụng nguồn cấp dữ liệu thay cho dấu chấm phẩy để dễ đọc - sẽ hoạt động tương tự.

Điều này khá đơn giản - g(m,n)hàm sử dụng đệ quy và phần còn lại ( %) để trích xuất p^nthừa số từ đầu vào m, với n=1mặc định và sau đó nhân pvới mỗi bước của đệ quy, do đó đầu ra sẽ là p^n. Mã áp dụng điều đó cho n/gcd(m,n), và sau đó m/gcd(m,n)để có được biểu thức thích hợp. k=gcd(m,n)được sử dụng để tránh tính toán gcd(m,n)hai lần, để lưu các ký tự. m!=0là một thử nghiệm để xử lý các trường hợp x=0.

Kết quả có dạng N/1hoặc 1/Nnếu thích hợp, nơi Np^e.


1

J, 35 34 byte

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

Đây là một động từ nhị phân lấy số nguyên tố plàm đối số bên trái của nó và mảng m nlàm đối số bên phải của nó. Nó luôn in dấu gạch chéo /và trả về 0/1nếu m = 0. Sử dụng nó như thế này:

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

Giải trình

Lần x:lượt mở rộng độ chính xác, vì chúng tôi xử lý số lượng rất lớn. Phần còn lại của mã hoạt động như sau:

(,'/'&,)&":/@(%+./)@(]<.^+.|.@])
                        ^         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

0

CJam, 42 byte

q~)\_:*g_sW<o@*28#f{{{_@\%}h;}:G~}_~Gf/'/*

Điều này kết thúc với một lỗi (sau khi in 0) cho đầu vào 0. Hãy thử trực tuyến trong trình thông dịch CJam .


0

Stax , 32 byte

éE▌ΦΔΘao£╙)ΩuÅI~AAε3∞xC█&½╤%╩▌ïö

Chạy và gỡ lỗi nó

Nên có thể làm cho nó ngắn hơn. Hỗ trợ riêng cho phân số của Stax khá gọn gàng.

Tương đương ASCII:

hY{y:+y|aEGsG-ys|**}0?}0{^scxHY%Cy/sWd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.