计算有理数的p-adic范数
编写一个函数或程序,该函数或程序将3个整数m,n,p(其中p是一个正质数)作为输入,然后将p-adic范数(由表示|m/n|_p)输出为(完全归约)分数。众所周知,费马特的边距很小,但未知的是他的电脑屏幕很小。因此,请尝试使代码尽可能短,以使其适合Fermat的屏幕!
定义
给定一个质数p,每个分数m/n都可以唯一地写(忽略符号),(a/b)* p^e即e整数,p既不除a也不除b。该p进规范的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评估或规范的内置功能。
示例(从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
有趣的琐事
(不一定要了解/阅读此挑战,但也许很高兴作为动机来阅读。)
(如果我使用了错误的单词或其他错误,请纠正我,我不习惯用英语来谈论这个问题。)
如果您将有理数视为一个字段,则p-adic范数会得出p-adic度量d_p(a,b) = |a-b|_p。然后,您可以根据该指标完成此字段,这意味着您可以构造一个新字段,其中所有柯西序列都将收敛,这是一个不错的拓扑属性。(例如,有理数没有,而实数有。)这些p-adic数就像您可能已经猜到的那样,在数论中使用了很多。
另一个有趣的结果是Ostrowski定理,该定理基本上说,有理数上的任何绝对值(如下定义)都是以下三个之一:
- 琐碎的:
|x|=0 iff x=0, |x|=1 otherwise - 标准(真实):
|x| = x if x>=0, |x| = -x if x<0 - p-adic(如我们所定义)。
绝对值 / 度量只是对我们认为距离的概括。绝对值|.|满足以下条件:
|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功能也出来了吗?:P