Обчисліть р-адичну норму раціонального числа
Напишіть функцію або програму, яка бере 3 цілі числа m,n,p
(де p
є позитивним простим) як вхідні дані, які виводять p-адичну норму (позначається |m/n|_p
) як (повністю зменшений) дріб. У Ферма, як відомо, є лише дуже невеликі запаси, але те, що невідомо, це те, що у нього був дуже маленький комп'ютерний екран. Тому намагайтеся зробити код якомога коротшим, щоб він міг поміститися на екрані Ферма!
Визначення
З урахуванням простого числа p
, кожен дріб m/n
може бути записаний однозначно (ігноруючи знаки) як (a/b)* p^e
такий, який e
є цілим числом і p
не ділить ні a
ані норму b
. Р-адіческой нормою в m/n
це p^-e
. Існує особливий випадок, якщо дріб 0: |0|_p = 0
.
Формат виводу повинен бути x/y
(наприклад 1/3
; для цілих чисел дозволено 10
або рівномірно 10/1
, для негативних чисел повинен бути провідний мінус, наприклад -1/3
)
Деталі
Програма повинна використовувати stdin / stdout або просто складатися з функції, яка повертає раціональне число або рядок. Ви повинні припустити, що введення m/n
не зменшено повністю. Можна припустити, що p
це прем'єр. Програма повинна бути в змозі обробляти цілі числа від -2^28
до 2^28
, і не повинна займати більше 10 секунд.
Вбудовані функції факторизації та просте перевірки заборонені, а також вбудовані базові конверсії та вбудовані функції, які обчислюють p-адичну оцінку або норму.
Приклади (викрадені з вікіпедії ):
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
Цікаві дрібниці
(Не потрібно знати / читати для цього завдання, але, можливо, приємно читати як мотивацію.)
(Будь ласка, виправте мене, якщо я вживаю неправильні слова, або щось інше не так, я не звикла говорити про це англійською мовою.)
Якщо розглядати раціональні числа як поле, то р-адична норма індукує p-адичну метрику d_p(a,b) = |a-b|_p
. Тоді ви можете заповнити це поле стосовно цієї метрики, це означає, що ви можете побудувати нове поле, де сходяться всі каучукові послідовності, що є приємною топологічною властивістю. (Яких, наприклад, раціональних чисел немає, але реальні цифри .) Ці p-адичні числа , як ви могли здогадатися, використовуються багато в теорії чисел.
Іншим цікавим результатом є теорема Островського, яка, по суті, говорить, що будь-яке абсолютне значення (як визначено нижче) на раціональних числах є одним із наступних трьох:
- Тривіальне:
|x|=0 iff x=0, |x|=1 otherwise
- Стандарт (справжній):
|x| = x if x>=0, |x| = -x if x<0
- P-адик (як ми його визначили).
Абсолютна величина / метрика - це лише узагальнення того, що ми вважаємо дистанцією . Абсолютна величина |.|
задовольняє наступним умовам:
|x| >= 0 and |x|=0 if x=0
|xy| = |x| |y|
|x+y| <= |x|+|y|
Зауважте, що ви можете легко побудувати метрики з абсолютних значень і навпаки: |x| := d(0,x)
або d(x,y) := |x-y|
, таким чином, вони майже однакові, якщо ви можете додати / субстратувати / помножити (що є в цілісних областях). Звичайно, ви можете визначити метрику на більш загальних множинах, без цієї структури.
|x|_11 = 11
, правда? Або просто 11
добре? І чи має це справлятись із x=0
справою?
x=0
випадок і для цього прикладу ви можете вихід 11
, а також 11/1
, але ви не повинні друкувати |x|_11
.
PadicNorm
функція Mathematica також відсутня? : P