基本上,每个人都认为你在学校学习的(相乘)方法是最好的,但实际上这是一个活跃的研究领域,”法国国家科学研究中心的数学家、论文合著者约里斯·范德霍芬说道。该论文发表在法国的国家开放存取文献数据库Archive ouverte HAL上。

从计算圆周率的新位数到寻找大质数,许多计算问题的复杂性都可以归结为乘法运算的速度。按照范德霍芬的描述,他们的研究结果其实是为许多其他类型的问题的求解速度设定了一种数学极限。

“在物理学中,有一些重要的常数,比如光速,可以用来描述各种现象,”范德霍芬说,“如果你想知道计算机解决某些数学问题的速度能有多快,那么就可以将整数乘法视为某种基础,你可以用它来表示这些速度。”

大多数人都用同样的方法学习乘法。我们把两个数分两排写,用下面数字的每一位乘以上面数字的每一位,最后排列好再做加法。如果是两个两位数的数相乘,那你一共要做四个较简单的乘法来得到最终的乘积。

这种小学中所教的方法或称“进位”法需要n^2个步骤,其中n是每个相乘数字的位数。所以3位数需要9次乘法,而100位数需要10000次乘法。这种进位法适用于只有几个位数的数字,但是当我们将具有数百万或数十亿位数的数字相乘(比如计算机精确计算圆周率,或者寻找大型质数)时,这种方法就会陷入停滞。两个10亿位数的数字相乘需要运行10^18次(10亿的平方)的乘法——这将花费现代计算机大约30年的时间。

几千年来,人们普遍认为没有更快的相乘方法。1960年,23岁的俄罗斯数学家安纳托利·卡拉苏巴参加了由20世纪最伟大数学家之一的安德烈·科尔莫戈罗夫主持的研讨会。柯尔莫戈罗夫在会上断言,没有少于n^2个步骤的通用乘法过程。卡拉苏巴认为并非如此。经过一周的努力,他找到了更快进行乘法运算的新方法。

卡拉苏巴的方法涉及将数字按数位分解,并以一种新颖的方式重新组合它们,允许使用少量的加法和减法替换大量的乘法。该方法可以节省时间,因为加法只需2n步,而不是n^2步。

“如果用加法的话,你可以在学校里提早一年就使用这一方法,因为它容易得多。你可以连续地相乘,几乎就像从右到左阅读数字一样快,”宾夕法尼亚州立大学的数学家马丁·富勒说道。他在2007年建立了当时最快的乘法算法。

当处理大数时,你可以重复卡拉苏巴的过程,将原始数字分解为几乎与数位同样多的部分。每进行一次拆分,就可以用加法和减法来代替乘法,从而减少很多步骤。澳大利亚新南威尔士大学的数学家、这篇新论文的合著者大卫·哈维说:“你可以把一些乘法转化为加法,重点在于,对电脑来说,做加法的速度会更快。”

卡拉苏巴的方法使得仅使用n^1.58个一位数乘法就可以进行大数的相乘。然后在1971年,德国数学家阿诺德·肖恩哈格和沃克尔·斯特拉森发表了一种方法,可以在n×log n×log(log n)个步骤内完成的大数乘法,其中log n是n的对数。对于两个10亿位数的数字,卡拉苏巴的方法需要大约额外运算165万亿个步骤。

肖恩哈格和斯特拉森的方法主要是关于计算机如何运算大数乘法,对未来的研究产生了两个重要的长期影响。首先,该方法引入了一种来自信号处理领域的技术,即快速傅里叶变换。该技术一直是所有快速乘法算法的基础。

其次,在同一篇论文中,肖恩哈格和斯特拉森推测应该有一种更快的算法,一种只需要n×log n个单位数运算的方法,而且这种算法可能是最快的。他们的推测基于一种直觉,即像乘法这样的基本运算必须有一个比n×log n×log(log n)更优雅的极限。

“人们普遍认为,乘法运算是一项非常重要的基本运算,以至于从美学的角度来看,这么重要的运算需要一个很好的复杂度边界,”富勒说,“从一般经验来说,基本事物的数学最终总是优雅的。”

肖恩哈格和斯特拉森提出的n×log n×log(log n)方法直到36年后才被取代。2007年,富勒提出了新的方法,闸门打开了。在过去的十年里,数学家们相继发现了更快的乘法算法,每一种算法都在一点点逼近n×log n,但都没有完全达到。最终在上个月,哈维和范德霍芬做到了。

他们的方法主要是对前人工作进行了改进,包括拆分数字,使用改进版的快速傅里叶变换,并利用了过去40年取得的其他进展。范德霍芬说:“我们以更加频繁的方式使用(快速傅里叶变换),而不是只使用一次,并且用加法和减法取代更多的乘法。”

哈维和范德霍芬的算法证明了乘法可以在n×log n步内完成,但这并不能证明没有更快的方法。要确定这是可能的最佳方法要困难得多。今年二月底,丹麦奥尔胡斯大学的一个计算机科学家小组发表了一篇论文,认为如果另一个未经证实的猜想也是正确的话,那么哈维和范德霍芬确实提出了最快的乘法运算方法。

虽然新算法在理论上具有重要意义,但在实践中还不会带来太大的变化,因为它只比已有的算法好一点点。“我们所期望的是,这种方法的运算速度能比现在快三倍,”范德霍芬说,“不会太过惊人。”

此外,计算机硬件的设计也发生了变化。20年前,计算机的加法运算比乘法运算快得多。经过过去20年的发展,乘法和加法之间的速度差距已经大大缩小,在一些芯片架构中,乘法甚至可以比加法更快。哈维表示,利用一些硬件,“你实际上可以通过让计算机做乘法来加快做加法的速度,这简直太疯狂了。”

硬件会随着时代而改变,但一流的算法是永恒的。不管未来的计算机是什么样子,哈维和范德霍芬的算法仍然是最高效的乘法算法。

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

php实现两个数相乘,最高效的乘法:两个非常大的数字相乘迄今最快算法相关推荐

  1. c语言求两个数的乘积和商,输入两个整数,求出它们的商数

    编写一个程序,输入两个整数,计算并输出它们的和,乘积,差,商和余数,C语言, #includevoidmain(){inta,b;printf("Inputtwointegers:" ...

  2. 比较两个数的大小,自定义比较两个整数的大小的方法

    比较两个数的大小,自定义比较两个整数的大小的方法: 如果第一个数大,返回1 如果相等返回0 如果第一个数小,返回-1 在Main()方法中输入两个数,调用这个方法 示例: 请输入两个数: 45 56 ...

  3. 已定义了两个整数变量A和B,完成下列功能: (1)若两个数中有一个是奇数,则将奇数存入A中,偶数存入B中(2)若两个数均为奇数,则将两数均加1后存入原变量(3)若两个数均为偶数,则两个变量均不改变。

    已定义了两个整数变量A和B,试编写程序完成下列功能: (1)若两个数中有一个是奇数,则将奇数存入A中,偶数存入B中: (2)若两个数均为奇数,则将两数均加1后存入原变量: (3)若两个数均为偶数,则两 ...

  4. 【Java常用方法】求两个数的最大公因数、最小公倍数,两数是否互质

    最大公因数 最好的办法就是gcd辗转相除法.有两种方式,一种是迭代,一种是递归. //迭代版本 int gcd(int a,int b){while(b!=0){int r=b;b=a%b;a=r;} ...

  5. 数组中两个数的最大异或值 两数异或值一定小于两数相加和

    链接:数组中两个数的最大异或值 给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n . 进阶:你可以在 O(n) 的时间 ...

  6. 在标准c语言中 =是判断两个数是否相等,='运算符用于判断两个数是否相等。

    "始于事亲",运算于判是指从小就要尊敬和孝顺自己的父母双亲,以及关爱与自己有血缘关系的兄弟姐妹等亲人,这是一个人行孝的开始阶段. 符用空巢老人生活特点( ). 断两老人常见的情绪反 ...

  7. java两个数之间质数求法,求任意两个整数之间质数的个数的代码!!!(新手编写)...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 /** * Title:Calculate acount of prime number between preNum and rearNum; * Au ...

  8. python怎么输入两个数然后求差值_python两个日期之间天差值获取

    因为我也刚刚接触python,这个原则上也是百度找到的,原来那位我也找不到了...... 主要就是使用datetime进行转化然后进行相减,获得如[diff_days] : 00:00:00形式的结果 ...

  9. python怎么一次输入两个数_python怎么一次输入两个数

    Python中输入多个数字: a, b, c = map(int, input().split()) 1.输入一个数字直接 m = int(input()) 2.输入两个数字就是 m, n = map ...

最新文章

  1. 9月13日学习内容整理:异常处理
  2. 数据库相关概念以及简单SQL语句
  3. 。net面试题(2)
  4. 用 ArrayList 还是 LinkedList?
  5. linux校园网电脑开wifi密码,Linux/Ubuntu 16.04 使用校园网客户端Dr.com DrClient 有线连网,同时开启WiFi热点...
  6. 剑指offer03-数组中重复的数字(java)|leetcode刷题
  7. Azure 部署 Asp.NET Core Web App
  8. ajax中迭代是什么意思,Ajax 局部刷新迭代器的内容
  9. Spring@懒惰注释
  10. python3中的int类型占64位,有没有什么办法来强制Python来使用64位整数的Windows?
  11. 程序员怎样锻炼编程思维(学习方法)
  12. leecode刷题(4)-- 存在重复数组
  13. 高中必备学习软件_10个适合高中生学习的网站amp;软件,完全免费,9科全覆盖!...
  14. oracle 查询temporary table,【TEMPORARY TABLE】Oracle临时表使用注意事项
  15. 单片机实习音乐播放器的源码
  16. 在线教育数据分析实战项目案例
  17. Java初转型-Maven入门
  18. Qt quick 示例:推特搜索小程序开发
  19. STM32 GPIOx_CRL/GPIOx_CRH 寄存器
  20. seata: endpoint format should like ip:port

热门文章

  1. nginx服务器 java项目,服务器使用Nginx如何部署Springboot项目
  2. Husky仿真环境配置
  3. ubuntu中如何提高源的下载速度
  4. 今日头条起诉今日油条!后者还注册了“饼多多”和“快手抓饼”
  5. 同济大学Python程序设计基础 实验九:数据可视化
  6. 打开Microsoft Outlook时出现意外错误如何解决?
  7. 饮食健康系统源码php,织梦DEDECMS仿健康之家健康问答系统整站源代码
  8. 保护眼睛,开启浏览器的夜间模式 顺便学下!important的作用
  9. xpath-通过列表推导式和string(.)的方式获取标签下包含子标签的所有文本
  10. 虚拟机(Please umount the filesystem and rectify the problem(s))记录