10.1 数论初步
这一章开始讲一些关于数论的初步知识。
10.1.1 欧几里得算法和唯一分解定理
除法表达式
给出一个这样的除法表达式,x1/x2/x3···/xk,其中xi是正整数。除法表达式应当按照从左到右的顺序求和,例如1/2/1/2的值为1/4。现在可以在表达式中添加括号用来改变运算顺序。
判断是否可以通过添加括号,使表达式的值为整数。
分析:首先我们需要知道的是,给表达式中的一段加了括号,相当于对这个括号内的xj前面的/改成了*。我们现在考虑一个情况:假设我们改变了xi到xj之前的符号,然后再改变x(i+1)到xj之前的符号。事实上两次操作之后只有xi之前的符号发生了改变。
表达式的值一定可以写成若干个xi的乘积除以若干个xj的乘积。于是根据上面的结论我们可以知道:除了x2必须放在分母的位置,其他数都可以放在分子的位置。
于是问题就转化为了,判断E=x1x3x4···xk/x2是否为整数。
直接进行高精度计算显然不怎么合理,书上提供了两种方法:
第一种方法是利用唯一分解定理,将X2分解成若干个素数相乘的形式:X2=p1a1p2a2p3a3·······
然后依次判断每个piai是否是x1x3x4···xk的约数,只需将xi中pi的指数全部相加,判断结果是否比ai大即可。
第二种方法是直接约分:每次约掉xi和x2的最大公约数,直到x2被约分到1。两个函数如下:
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);}//辗转相除法求最大公约数
int judge(int *x){
x[2]/=gcd(x[2],x[1])
for