Karatsuba-Ofman乘法器是俄罗斯人Karatsuba于1962年提出的,主要思想是采用分治算法计算整数乘法,将计算复杂度向前推进到O(nlog23)O(n^{log_23})O(nlog2​3),而此前普遍认为整数乘法的计算复杂度是O(n2)O(n^2)O(n2)。
来看一个例子:假设n=2ln=2ln=2l,x=x12l+x0x=x_12^l+x_0x=x1​2l+x0​,y=y12l+y0y=y_12^l+y_0y=y1​2l+y0​是2l2l2l-位整数,于是:
xy=(x12l+x0)(y12l+y0)xy=(x_12^l+x_0)(y_12^l+y_0)xy=(x1​2l+x0​)(y1​2l+y0​)
=x1⋅y122l+[(x0+x1)⋅(y0+y1)−x1y1−x0⋅y0]2l+x0y0=x_1\cdot y_12^{2l}+[(x_0+x_1)\cdot(y_0+y_1)-x_1y_1-x_0\cdot y_0]2^l+x_0y_0=x1​⋅y1​22l+[(x0​+x1​)⋅(y0​+y1​)−x1​y1​−x0​⋅y0​]2l+x0​y0​
xyxyxy可以通过3个lll-位的整数乘法(而不是2l2l2l-位的整数乘法)和2个乘法,2个减法算式计算出来。
若lll数值较大,加法和减法相对乘法的计算代价可以忽略。在经典算例中,程序可以反复迭代到中位数,并一直执行到满足阈值(可能的值是机器字长度)的条件才停止。
对于大小适中的整数,Karatsuba算法的执行上限是需要考虑的因素。不同于传统方法,Karatsuba算法的执行尽可能减少移位请求(对于2l2^l2l和22l2^{2l}22l乘法),并且高效使用面向字节的操作。例如:采用拆分字节的边界的方法有可能更好,一个指定阶段的分裂可以拆分成2个以上片段。
例1(Karatsuba-Ofman方法):考虑224-位整数xxx和yyy的乘法,运算设备的字节长度为W=32W=32W=32。2个深度为2的方法展现如下图所示,显然,图a的裂项从数学上看可能更为优雅并且在代码上更具备重用性。然而,却需要更多的移位操作,这是因为裂变并非以字长单位为边界进行。如果56-位数的乘法的代价近似于64-位数乘法,显然裂项对于硬件容量利用不足,这是因为如图b所示,9个64位乘法与1个32位、8个64位乘法的代价完全不同。另外,图b的列项建立在字长单位为边界的基础上,由于存在加法移位,具有更多的复杂的跨项计算。例如,深度为2的跨项具有形式

上图展示了224-位的整数分裂成深度为2的二叉树。图a所示的xyxyxy乘积包括采用3个112∗112112*112112∗112位乘法,每个执行又采用3个5656位的乘法。b图所示的xy包括采用一个9696位乘法(列项为一个3232位和2个6464位乘法)和2个128128位的乘法(每个产生3个64∗6464*6464∗64位乘法)。
如下:
(x0+x1)(y0+y1)−x1y1−x0y0(x_0+x_1)(y_0+y_1)-x_1y_1-x_0y_0(x0​+x1​)(y0​+y1​)−x1​y1​−x0​y0​
其中,x0+x1x_0+x_1x0​+x1​和y0+y1y_0+y_1y0​+y1​在图a为57-位数,在图b为65-位数。虽然(x0+x1)(y0+y1)(x_0+x_1)(y_0+y_1)(x0​+x1​)(y0​+y1​)可以被1个64
64位乘法和2个加法计算出来,图b列项的代价仍然有点大。

上图展现了192-位整数的深度为2的裂项。图a的乘法xyxyxy具有3个96∗9696*9696∗96的乘法,每个乘法执行1个32∗3232*3232∗32和2个64∗6464*6464∗64的乘法(每个乘法需要3个32*32位乘法),总共需要21个32∗3232*3232∗32位乘法。图b或图c,仅需要18个32∗3232*3232∗32位乘法就可以完成计算。
例2(192位数乘法):考虑Karatsuba-Ofman算法应用于192-位整数乘法的例子,假设设备字长W=32W=32W=32。按上图所示的3个深度位2的方法,图a需要21个32∗3232*3232∗32位乘法,图b和图c只需要18个。主要的思路是3l3l3l-位整数x=x222l+x12l+x0x=x_22^2l+x_12^l+x_0x=x2​22l+x1​2l+x0​和y=y222l+y12l+y0y=y_22^{2l}+y_12^l+y_0y=y2​22l+y1​2l+y0​能够计算如下:
有限域的乘法性能在椭圆曲线机制中是非常重要的。囿于硬件乘法器和传播成本的限制,执行以上算法势必会引起明显的瓶颈。

Karatsuba-Ofman乘法器相关推荐

  1. 【iCore4 双核心板_FPGA】例程八:乘法器实验——乘法器使用

    实验现象: 程序运行时,绿色led闪烁(目前,具体的乘法器调用请参考iCore3乘法器例程) 核心代码: module multiplier_ctrl(input clk_25m,input rst_ ...

  2. FPGA之道(65)代码中的约束信息(二)乘法器的相关约束

    文章目录 前言 乘法器的相关约束 use_dsp48 mult_style 前言 这是这个话题的第二篇,最重要的前言是本文节选自:<FPGA之道>. 乘法器的相关约束 通常,FPGA开发者 ...

  3. 乘法器专题研究(内含所有类型乘法器)

    乘法器的verilog HDL设计汇总 1.移位相加乘法器的设计: 其大致原理如下: 从被乘数的最低位开始判断,若为1,则乘数左移i(i=0,1...(WIDTH-1))位后,与上一次和相加:若为0, ...

  4. 乘法器之五(混和式乘法器(Hybrid multiplication))

    4)    混和式乘法器(Hybrid multiplication) 混合乘法器模式结合了半并行和乘加两种乘法器模式,它有不同的两个输入位流,并且乘以不同的系数. 这种模式在象FFTs这样的有复数乘 ...

  5. 5位无符号阵列乘法器设计_可变位宽的大规模矩阵乘法方法

    引言 本文介绍了一种数据位宽可变的乘法方法,由于避免了DSP的使用,可以充分利用LUT资源,在DSP数量少的芯片上也可以获得很高的计算量.这种方法更适合大矩阵乘法,矩阵越大,计算效率就会越高. 01 ...

  6. 乘法器的verilog实现(并行、移位相加、查找表)

    并行乘法器,也就是用乘法运算符实现,下面的代码实现8bit无符号数的乘法. 代码: 1 module mult_parrell(rst_n, 2 clk, 3 a, 4 b, 5 p 6 ); 7 p ...

  7. VerilogHDL8位串行乘法器的分析(2)

    VerilogHDL8位串行乘法器的分析(2) 关于8位串行乘法器的缺点,书上还提到一点,就是速度慢.具体分析串行乘法器的硬件结构,也就是存在逐步进位信号的传递所造成的延迟,就8位串行乘法器来说,请看 ...

  8. 设计一个程序实现两个任意长的整数的求和运算_深入 Python (7) Karatsuba 实现长整数乘法...

    Python 的长整数乘法使用了 Karatsuba 算法,昨天写的比较粗,今天仔细研究了下它的实现,真是妙啊. 多项式乘法 在一切开始之前,需要回顾多项式乘法公式: (a + b)(c + d) = ...

  9. FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析

    FPGA学习之路--原码二位乘法器及Verilog代码分析 原理 原码乘法可以分为原码一位乘和原码二位乘,两者在实现规则上大同小异.原码一位乘每次判断乘数的最低位,对被乘数和部分积进行相应操作.而原码 ...

最新文章

  1. 剑指offer--3题
  2. python字典之defaultdict详解
  3. 上班族如何当老板 五大模式任你选
  4. python结果导入excel_荐Python读取、写入EXCEL,处理数据完成运算具体实例及代码,Pycharm中导入库的操作流程...
  5. java smtp_java通过smtp发送电子邮件
  6. probe request帧结构_WIFI基础知识(802.11)
  7. 亚马逊出的平板电脑_亚马逊发布新Fire HD 8系列平板电脑,90美元起
  8. pycharm + python36 + opencv + opencv_contrib库的安装
  9. gdb调试中出现optimized out
  10. 如何理解和应用Java的多态
  11. 【Python实例第19讲】图像分割的谱聚类
  12. 安装智能陈桥五笔时请小心
  13. uniapp中使用原生方式写页面头部,存在多级页面时,当点击返回图标按钮时,父页面的返回按钮消失了(已解决)
  14. 2022-2028全球多层共烧基板行业调研及趋势分析报告
  15. u盘里的视频文件损坏了怎么修复?
  16. 有什么适合学生党使用的无线蓝牙耳机?安卓平价蓝牙耳机推荐
  17. kernel 选项详解(stlinux2.3)
  18. 计算机组成原理 光盘中试题答案,白中英计算机组成原理光盘上试题及答案.doc...
  19. 地理总结(三)--川南川北川东川西划分
  20. ZZULIOJ:1011圆柱体表面积

热门文章

  1. php保留小数点4位,PHP小数点后保留几位的教程实例
  2. 看盘做短线的10种方法
  3. 机器学习实战一:泰坦尼克号生存预测 Titantic
  4. Log4j 重写 RollingFileAppender 实现按日期生成文件夹文件名
  5. 《introduction to information retrieval》信息检索学习笔记4 索引结构
  6. Task 07--面向对象的编程
  7. 3、nginx设置简单的代理服务器-阅读官方文档
  8. 乐游api接口平台(接口商)
  9. 历史上的今天:苹果电脑之父诞生;阿里巴巴收购雅虎中国;OpenAI 击败电竞世界冠军...
  10. 总结-互联网校招面试锦囊