10.1 数论初步

本文介绍了数论的初步知识,涵盖欧几里得算法、Eratosthenes筛法、扩展欧几里得算法、同余与模算术,并通过实例解析了数论在解决实际问题中的应用,如巨大斐波那契数的计算和无平方因子数的计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值