python中乘法运算,用python加减乘除

  python中乘法运算,用python加减乘除

  命令

  对于椭圆曲线算法,我们经常会遇到数据量很大的多项式乘除运算,比如:给定一个整数n,如何求出一个椭圆曲线方程,使其有理点群阶为n(这里是希尔伯特模多项式);都有涉及);或者,给定一条椭圆曲线的方程,计算该曲线在有限域上的点数(这里涉及除法多项式)。

  多项式除法在一定情况下可以转化为多项式乘法。所以如何快速计算多项式乘法是一个很有意义的问题。实际上,处理这两个多项式的更好的算法是使用NTT快速数论变换。但有些地方还没想好怎么做,先梳理一下FFT算法的实现。

  这篇文章偏向于python的实现。(毕竟具体教学的文章很多。

  我写过一些不是那么“直接”的关于傅立叶变换的文章。作为参考,Alepha E E:关于复变量(V)从傅里叶变换到四分方的注记,以及一些几何推广。胡安兰。胡志。Comalephae E:从[向量]的角度谈谈函数(例如:傅立叶变换)zhuanlan.zhihu.com

  (这两篇文章我写的比较早,有些略显幼稚。)

  数据结构

  我准备用Python来做。Python附带了一个字典数据类型,多项式类就是基于这个数据类型定义的。

  首先我们要搞清楚我们希望多项式具有什么样的代数结构,也就是从多项式指数到多项式系数的内射性。因此,对于多项式

  存储形式:字典的键值是多项式的指数,值是多项式对应的指数的系数。

  在构造的时候,可以直接输入符合这样一个多项式的字典。

  在构造多项式之前,至少要有加法。添加时,如

  ,与

  以字典为准,特拉弗斯

  索引并确定它是否在

  如果是,则添加相应键值的值,并消除和的相应指数;

  如果没有,则直接添加到返回的结果中。

  傅里叶变换

  对于普通乘法,如

  ,需要做些什么

  时代周刊。

  傅立叶变换用于变换原始:

  译成

  当然,以上两种表示可以是对等的。

  注意,单位根具有这样的性质:

  ,以及

  从而可以重复进行计算。

  向上(此处

  是两个不同的值,不管上述多项式系数如何)

  比如对这个多项式做傅里叶变换。

  首先手动组织,但是有

  进一步地

  这样,我们可以发现,当我们重新计算时:对于的形式

  手术进行了4次;

  对于表单

  手术做了两次;

  对于表单

  的操作执行了一次。

  利用单位根的“半”性质可以代换单位根。

  这就是乘法中傅里叶变换的本质。

  通过卷积定理,我们可以满足

  这确保了产品的性能在转化前后都得到满足。

  附上代码。

  def FFT 4多项式(poly,max_deg):

  Ind_coe=poly.ind_coe #其中Ind_coe是多项式的指数系数字典

  如果yjdy(max _ deg)[3:] 1 :#这里的两个判断是为了初始化。

  max _ deg=2 * * len(yjdy(max _ deg)[2:]))

  M=最大度数

  ind _ Coe={ I:ind _ Coe[I]if I in ind _ Coe else 0 for I in range(max _ deg)}

  否则:

  M=最大度数

  ind _ Coe={ I:ind _ Coe[I]if I in ind _ Coe else 0 for I in range(max _ deg)}

  ans={}

  m=len(yjdy(max_deg)[3:])

  对于范围内的项目(max_deg):

  t=1

  tmp_ind=ind_coe.copy()

  max_deg=len(tmp_ind)

  while len(tmp_ind)!=1:

  unit _ root=NP . exp(2 * math . pi * Complex(0,1)*item*2**(m-t)/(M))

  tmp_ind={ I:tmp _ ind[I]tmp _ ind[I max _ deg//2]* I在tmp _ ind中的unit _ root if I max _ deg//2 }

  t=1

  max_deg=max_deg//2

  ans[item]=tmp_ind[0]

  返回多项式(ans)

  对于逆变换,只需要取单位根的指数的复数。

  对于多项式的数据结构,可以自己实现。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: