2022.11.21 闲话
辗转相除法 / 欧几里得算法:
给两个数,求 \(\gcd(a,b)\) .
过程:
- 若 \(b=0\),返回 \(a\) .
- 否则,返回 \(\gcd(b,a\bmod b)\)(递归计算).
优化:Binary GCD 或者叫 Stein GCD .
时间复杂度分析:
取 Fibonacci 相邻两项得到单次最劣时间复杂度 \(\Theta(\log n)\),\(n\) 是值域 .
求多个数的 GCD 可以势能分析,每个均摊 \(\Theta(1)\),也就是 \(k\) 个数 GCD 的时间复杂度是 \(\Theta(k+\log n)\) .
具体的就是考虑每个数被模一次至少减半,减半最多 \(\log n\) 次,然后就差不多完了 .
然而也只有均摊出来才是 \(\Theta(1)\) 的了吧,Knuth 指出若 \(a,b\) 均匀随机于 \([1,n]\),则辗转相除计算 \(\gcd(a,b)\) 的期望步数为 \(\dfrac{12\ln2}{\pi^2}\ln n+O(1)\),那个 \(O(1)\) 的常数大约为 \(0.06\) .
更相减损:最坏 \(\Theta(n)\),取 \(n\) 和 \(1\) 即可卡满 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16911666.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ