快速判断互质——浅析

这两天碰到一个问题,给定一个范围[1..n], 以及任意数m(1<m<=n), 统计给定域内与m互质的自然数的个数.

我们知道判断两个数互质充分必要条件是,两个数最大公约数=1, 这样,我们只需枚举i(1<=i<=n), 求gcd(i,m)即可,

辗转相除求gcd(i, m) 时间复杂度为logm+logi, 加上枚举时间,复杂度就为为 n*logm+logn!

若问题仅求一次m,近乎线性时间,是不错解决方案;但如果,如此取值m,比如在[1...n]中随即选取k个数,求每个

数在[1..n]中互质的个数,那么问题复杂度就变成O(k*n)了, 若n=50000, k=10000(即5个数中选取1个), 时间近乎数

十秒,这将不可忍受。

另法,快速求得[1..n]中与m不互素的个数res, 则n-res...

费费定理: 若整数i与m不互素,则m所有质因子中,至少一个也是i的质因子

步骤一:分解m求其质因子
 
方法,枚举[2..sqrt(m')]试除m';这里m'初始值m,每次枚举到一个质因子,便除去m'中所有此因子,

因此平均时间远小于sqrt(m), 但最坏情况下仍使sqrt(m), 可以做个优化,预处理[1..n]生成素数表(n=50000, 素数约5000),

筛选法求素数表时间O(3*n),然后直接拿生成的素数试除。

步骤二:求不互质个数

假设m分解后,质因子为p[pCnt], 那么[1...n]中包含这些

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值