翻了各课件,发现……

某个英文网站 是这么说的:

There is a way to calculate the GCD and resultants in O(nlog⁡2n)O(n\log^2n)O(nlog2n). To do this you should note that if you consider a(x)=a0+xka1a(x)=a_0+x^ka_1a(x)=a0​+xka1​ and b(x)=b0+xkb1b(x)=b_0+x^kb_1b(x)=b0​+xkb1​ where k=min⁡(deg⁡a,deg⁡b)/2k=\min(\deg a,\deg b)/2k=min(dega,degb)/2 then basically the first few operations of Euclidean algorithm on a(x)a(x)a(x) and b(x)b(x)b(x) are defined by the Euclidean algorithm on a1(x)a_1(x)a1​(x) and b1(x)b_1(x)b1​(x) for which you may also calculate GCD recursively and then somehow memorize linear transforms you made with them and apply it to a(x)a(x)a(x) and b(x)b(x)b(x) to lower the degrees of polynomials. Implementation of this algorithm seems pretty tedious and technical thus it’s not considered in this article yet.

你如果脑子一冲,傻乎乎地去直接分治一半算出线性变换,DEBUG 一下会让你冷静过来……
你发现这个线性变换应用到整体多项式上没有任何效果……

而 Picks 的 Introduction to Polynomials 也写的比较晦涩,因此在这里稍微详细地谈谈,以正视听……


给多项式 a,b∈F[z]a, b \in \mathbb F[z]a,b∈F[z],我们原本的问题是求 GCD 以及扩展欧几里得的解:x,y∈F[z],ax+by=gcd⁡(a,b)x, y\in \mathbb F[z], ax + by = \gcd (a, b)x,y∈F[z],ax+by=gcd(a,b)

由于多项式取模最坏情况下每次只让一个多项式的度数减小,这种方法的复杂度最好也就是 Θ((deg⁡a)(deg⁡b))\Theta((\deg a) (\deg b))Θ((dega)(degb)) 的。

我们考虑求解一个中间情况叫做 HALF-GCD,设 k=min⁡(deg⁡a,deg⁡b)k = \min(\deg a, \deg b)k=min(dega,degb),这个东西让我们对于 a,ba, ba,b 能得到一个矩阵 (x1y1x2y2)\begin{pmatrix} x_1 & y_1 \\ x_2 & y_2 \end{pmatrix}(x1​x2​​y1​y2​​),其中 deg⁡x≤k2+o(k)\deg x \le \frac k 2 + o(k)degx≤2k​+o(k),且 deg⁡(ax1+by1),deg⁡(ax2+by2)≤k2+o(k)\deg (a x_1 + b y_1), \deg (a x_2 + b y_2) \le \frac k 2 + o(k)deg(ax1​+by1​),deg(ax2​+by2​)≤2k​+o(k)(除非它们的 gcd⁡\gcdgcd 的 deg⁡\degdeg 比这个大)。也就是说这个 HALF-GCD 可以理解成是将欧几里得过程执行到一半的产物。

睿智的你想必已经意识到了这个东西如何得出真正的欧几里得的解。我们只需要调用一次这个算法,然后就规约到了一个 n2\frac n22n​ 的子问题(可能需要额外支付 O(M(n))O(M(n))O(M(n)) 时间用于调整较大的多项式),那么我们就得到了一个 Θ(M(n))+T(n)+T(n/2)+T(n/4)+⋯\Theta(M(n)) + T(n) + T(n/2) + T(n/4) + \cdotsΘ(M(n))+T(n)+T(n/2)+T(n/4)+⋯ 的方法。

那么接下来考虑通过分治来解决 HALF-GCD:设 k=min⁡(deg⁡a,deg⁡b)k=\min(\deg a, \deg b)k=min(dega,degb),我们首先算出 a/zk/2,b/zk/2a/z^{k/2}, b/z^{k/2}a/zk/2,b/zk/2 对应的矩阵,这样一个矩阵作用与原多项式有两部分:考虑将原来的表为 a=a0+a1zk/2,b=b0+b1zk/2a=a_0 + a_1 z^{k/2}, b=b_0 + b_1 z^{k/2}a=a0​+a1​zk/2,b=b0​+b1​zk/2,那么 ax+byax + byax+by 中,deg⁡((a1x+b1y)zk/2)=34k+o(k)\deg ((a_1 x + b_1 y)z^{k/2}) = \frac 34 k + o(k)deg((a1​x+b1​y)zk/2)=43​k+o(k),另外 deg⁡(a0x+b0y)=34k+o(k)\deg (a_0 x + b_0 y) = \frac 34 k + o(k)deg(a0​x+b0​y)=43​k+o(k) 也比较显然。接着我们将得到的两个 34k\frac 34 k43​k 次多项式除掉前 zk/4z^{k/4}zk/4 项送进去,这样又再次保证了递归返回的又是一个 14k+o(k)\frac 14 k + o(k)41​k+o(k) 量级的结果,我们将两个矩阵相乘就得到了变换矩阵。而结果正好满足度数在 k2+o(k)\frac k 2 + o(k)2k​+o(k) 以内。时间复杂度 T(n)=2T(n/2)+M(n)T(n) = 2T(n/2) + M(n)T(n)=2T(n/2)+M(n),即 M(n)log⁡nM(n)\log nM(n)logn。消耗了 M(n)M(n)M(n) 的一方面是进行矩阵乘法,另一方面是可能在一些情况减少两个多项式次数的差,同时也可能发生剪枝。

综上所述,我们在 M(n)log⁡nM(n)\log nM(n)logn 的时间内完成了两个多项式的欧几里得求算,高精度整数的做法也是相似的。

这里 是一份代码,这里处理的时候是令 k=max⁡(deg⁡a,deg⁡b)k = \max (\deg a, \deg b)k=max(dega,degb),理论上是差不多的,目前尚且不知道这个代码是否存在一些 edge case 上的问题,欢迎大家指正。

HALF-GCD算法的阐述相关推荐

  1. JavaScript:实现ExtendedEuclidean扩展欧几里德GCD算法(附完整源码)

    JavaScript:实现ExtendedEuclidean扩展欧几里德GCD算法 /**** @param {Number} arg1 first argument* @param {Number} ...

  2. 【最大公约数 GCD】 --- 常用四大算法(辗转相除法,穷举法,更相减损法,Stein算法)

    [最大公约数 GCD] --- 常用的四大算法 1. 辗转相除法(又名欧几里德算法) 2. 穷举法(也称枚举法) 3. 更相减损法 (又名辗转相减法) 4. Stein算法 1. 辗转相除法(又名欧几 ...

  3. 28个不得不看的经典编程算法!!

    前十个是来自圣经的十大算法: 发起人的描述:<来自圣经的证明>收集了数十个简洁而优雅的数学证明,迅速赢得了大批数学爱好者的追捧.如果还有一本<来自圣经的算法>,哪些算法会列入其 ...

  4. [算法] 当今世界最为经典的十大算法--投票进行时

    当今世界最为经典的十大算法--投票进行时 ---------------------------------------- 第一部分.来自圣经的十大算法 第十名:Huffman coding(霍夫曼编 ...

  5. 程序员编程艺术(算法卷):第一章、左旋转字符串

    第一章.左旋转字符串 作者:July,yansha. 时间:二零一一年四月十四日. 说明:(狂想曲,有三层意思:1.思绪纷飞,行文杂乱无章,想到什么,记下什么.2.简单问题深入化,复杂问题精细化,不惧 ...

  6. gentry算法_28个不得不看的经典编程算法

    前十个是来自圣经的十大算法: 发起人的描述:<来自圣经的证明>收集了数十个简洁而优雅的数学证明,迅速赢得了大批数学爱好者的追捧.如果还有一本<来自圣经的算法>,哪些算法会列入其 ...

  7. 模板 - O(n)预处理,O(1)查询gcd

    整理的算法模板合集: ACM模板 基于值域预处理的快速 GCD算法 给定 nnn 个正整数 a1,a2,-,ana_1,a_2,\dots,a_na1​,a2​,-,an​ ,再给定 nnn 个正整数 ...

  8. 高通量测序技术和序列拼接算法探析

    高通量测序技术和序列拼接算法探析 时间:2019-05-27 来源:计算机科学 作者:周卫星,石海鹤 本文字数:16853字 摘    要: 高通量测序 (High-throughput Sequen ...

  9. 扩展欧几里得算法_扩展欧几里得递推算法

    欧几里得算法 表示 整数 a 与 b 的最大公约数. 若 t = a % b, 则 证明略. 递推版 gcd 算法 gcd 接受变量元组 (a, b) 作为输入,输出最大公约数 (r). 我们很难直接 ...

  10. 赠书:算法与数据中台“网约车业务实践”

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 在O2O 模式下,网约车平台成为其中最为经典的案例,无论 ...

最新文章

  1. shell脚本自动执行,top命令无输出
  2. 2022一建改革加考英语和计算机,2021年一建考试大改革吗 考六门科目吗
  3. Catalyst 2950/2955交换机的RSPAN配置
  4. 世界杯直播背后:腾讯云极速高清技术部署实录
  5. phpstorm一个窗口打开多个项目
  6. 使用泛型实现单例提供者(原创翻译)
  7. 《WinForm开发系列之控件篇》Item13 DirectoryEntry(暂无)
  8. LeetCode:204. 计数质数
  9. 数据仓库 Hive(内含大数据镜像下载)
  10. Android官方开发文档Training系列课程中文版:线程执行操作之定义线程执行代码
  11. 【最全资料下载】Kubernetes and Cloud Native Meetup (北京站)
  12. python遍历本地文件系统
  13. bzoj 3441: 乌鸦喝水(说实话有生之年没有见过这么难的模拟)
  14. CAD绘图设计效率慢?这些外挂神器帮你1小时完成3小时的工作!
  15. 查找DOM,受控与非受控组件
  16. 百度地图离线开发demo-迁徙图
  17. 中国电子标签(RFID)产业趋势研究及十四五发展规划建议报告2022-2028年版
  18. 人生有时需要“跳一跳”
  19. 02 设计师灵感网址(1)
  20. 咕泡p5人工智能CV+NLP技术项目实战

热门文章

  1. java计算两个经纬度之间的直线距离
  2. 姚爱红计算机组成原理知识要点,计算机组成原理课程混合教学模式探究
  3. 人之最美,纯朴初心,有所不为
  4. 机械臂D-H坐标系的建立
  5. 畅游或将私有化退市股价涨近50%,搜狐“吃饱”后能重回巅峰吗?
  6. LeetCode 781 森林中的兔子 题解
  7. 佳能2900打印机与win10不兼容_佳能LBP2900 64位驱动下载|佳能LBP2900打印机64位驱动支持Win10/Win7 下载_当游网...
  8. LOGO特训营 第三节 首字母创意手法
  9. 管理的常识(4):什么是计划
  10. 三月月赛 1005 wuli通通和doge(细节处理)