Вычислить p-адическую норму рационального числа
Напишите функцию или программу, которая принимает 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-adic оценку или норму.
Примеры (украдено из википедии ):
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-адическая норма индуцирует 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
- П-адик (как мы его определили).
Абсолютное значение / метрика - это просто обобщение того, что мы считаем расстоянием . Абсолютное значение |.|
удовлетворяет следующим условиям:
|x| >= 0 and |x|=0 if x=0
|xy| = |x| |y|
|x+y| <= |x|+|y|
Обратите внимание, что вы можете легко построить метрики из абсолютных значений и наоборот: |x| := d(0,x)
или d(x,y) := |x-y|
, так что они почти одинаковы, если вы можете добавить / substract / multiply (то есть в интегральных областях). Конечно, вы можете определить метрику на более общих наборах без этой структуры.
|x|_11 = 11
, верно? Или это просто 11
нормально? И должен ли он справиться с x=0
делом?
x=0
регистр, и для этого примера вы можете выводить 11
также 11/1
, но вам не нужно печатать |x|_11
.
PadicNorm
функция Mathematica также отсутствует? : P