跳到内容
新问题

对这个项目有疑问吗?注册一个免费的GitHub帐户以打开一个问题,并联系其维护者和社区。

单击“注册GitHub”,表示您同意我们的服务条款隐私声明。我们偶尔会向您发送与帐户相关的电子邮件。

已经在GitHub上了?登录到您的帐户

将Weil配对添加到Sage #4964

关闭
sagetrac-dmhansen公司 人体模型已打开此问题2009年1月11日·20条评论
关闭

将Weil配对添加到Sage #4964

sagetrac-dmhansen公司 人体模型已打开此问题2009年1月11日·20条评论

评论

@sagetrac-dmhansen公司
复制链接
人体模型

首先在EC点上添加(mollehansen的)Weil配对实现,并以这种方式为一般配对制定框架。

未来:

  • 这个Weil配对实现应该被更有效的实现所取代。
  • 其他配对可以使用相同的框架实现/包装。

组件:代数几何

关键词:配对

从迁移创建的问题https://trac.sagemath.org/tickt/4964

@sagetrac-dmhansen公司
复制链接
人体模型 作者

注释:1

已签入elliptic_points.py修补程序。
不知道框架有多少。

@约翰克雷莫纳
复制链接
成员

注释:2

当这里没有补丁时,怎么能关闭这张罚单?其他地方有补丁吗?如果是,在哪里?!

@约翰克雷莫纳
复制链接
成员

注释:3

我重新打开这个,因为David错误地认为提交他的更改就是所需的全部。他很快就会上传补丁。

@约翰克雷莫纳 约翰切莫纳重新打开了这个2009年1月25日
@sagetrac-mabshoff公司

此评论已最小化。

@约翰克雷莫纳
复制链接
成员

注释:6

虽然我没有做任何详细的测试,但这对我来说很好,我只查看了代码。

我有一个建议,当P或Q的实际阶数严格小于n时,应该加快速度:求出P和Q的阶数,比如m1和m2。(此处通用函数order_from_multiple可能有用。)设d=gcd(m1,m2)。很明显,结果是单位的第d根,可以通过(m1/d)*P和(m2/d)*Q的配对来计算。

我还有一个问题:与其等待被零除错误捕捉相关输入,为什么不进行离散对数计算来测试呢?对于大n,这可能要慢得多;如果能证明这个决定是正确的,那就太好了。

对不起,我现在只有这些时间了。

@sagetrac-dmhansen公司
复制链接
人体模型 作者

注释:7

我有一个建议,当P或Q的实际阶数严格小于n时,应该加快速度:求出P和Q的阶数,比如m1和m2。(此处通用函数order_from_multiple可能有用。)设d=gcd(m1,m2)。很明显,结果是单位的第d根,可以通过(m1/d)*P和(m2/d)*Q的配对来计算。

是的,我同意-目前唯一实现的是n阶点,我检查它们是否都是n阶,这实际上需要一些时间才能实现大n阶点。这里肯定还有改进的空间!

我还有一个问题:与其等待被零除错误捕捉相关输入,为什么不进行离散对数计算来测试呢?对于大n,这可能要慢得多;如果能证明这个决定是正确的,那就太好了。

嗯,对大n进行离散对数计算要慢得多。鉴于时间复杂性,我认为我们无法做得更好,因为米勒算法在输入n的比特数上是线性时间运行的。

你说得对,上面的论点应该在代码中注明。

回复@约翰切莫纳:

这对我来说很好,尽管我没有做任何详细的测试,我只看了代码。

我有一个建议,当P或Q的实际阶数严格小于n时,应该加快速度:求出P和Q的阶数,比如m1和m2。(此处通用函数order_from_multiple可能有用。)设d=gcd(m1,m2)。很明显,结果是单位的第d根,可以通过(m1/d)*P和(m2/d)*Q的配对来计算。

我还有一个问题:与其等待被零除错误捕捉相关输入,为什么不进行离散对数计算来测试呢?对于大n,这可能要慢得多;如果能证明这个决定是正确的,那就太好了。

对不起,我现在只有这些时间了。

@约翰克雷莫纳
复制链接
成员

注释:8

我成功地将补丁应用于3.3.alpha3,doctests通过了。但我尝试的第一个示例崩溃了:

鼠尾草:F.<a>=GF(19^4)sage:E=椭圆曲线(F,[-1,0])鼠尾草:P,Q=E.gens()鼠尾草:P.order(),Q.order((360, 360)#检查P和Q是否真正独立:sage:线性关系(P,Q,'+')(0, 360)圣人:P.weil_pairing(Q,360)---------------------------------------------------------------------------PariError追溯(最近一次呼叫为最后一次)...PariError:不可能的反模:(36)

所以pari(进行底层字段运算)试图除以零。

代码中的注释表明:(1)只有当点是独立的时才会发生运行时错误,并且(2)这些错误会被捕获。所以这里有一个反例。

代码中可能有错别字吗?

@约翰克雷莫纳 约翰克雷莫纳更改了标题将Weil配对添加到Sage [带评论]将Weil配对添加到Sage 2009年2月1日
@sagetrac-dmhansen公司
复制链接
人体模型 作者

注释:9

代码中可能有错别字吗?

嗯,我有点希望是这样的,否则这将是一个更大的问题。
调试时间!我会设法弄清楚,然后我会安装一个新补丁并通知你。谢谢你的评论。

@约翰克雷莫纳
复制链接
成员

注释:10

回复@sagetrac-dmhansen公司:

代码中可能有拼写错误吗?

嗯,我有点希望是这样的,否则这将是一个更大的问题。
调试时间!我会设法弄清楚,然后我会安装一个新补丁并通知你。谢谢你的评论。

我自己看不到这个问题。这个线()代码看起来不错。磨坊主()看起来不错,当这些点相互独立时,我看不出如何从_line()调用中获得0。[调试的一部分是确保线()可能永远不会返回零)。

还有两条评论:in磨光机(),您也许应该将t初始化为self.base_ring()(1),而不仅仅是1。其次,此代码同样适用于任何字段上的有限阶点,因此您应该移动整个代码块,以便函数是EllipticCurvePoint_field的成员,而不是子类ElliptiCurvePoint_finite_field的。

@sagetrac-dmhansen公司
复制链接
人体模型 作者

评论:11

我自己看不到这个问题。这个线()代码看起来不错。磨坊主()看起来不错,当这些点相互独立时,我看不出如何从_line()调用中获得0。[调试的一部分是确保线()可能永远不会返回零)。

在计算P=Q\neqO的斜率时_线路_功能。问题是,在重构我自己的代码并将其很好地放入sage之后,我忘记了子基P=Q\neqOx1=x2。所以零点来自没有单独处理的垂直坡度。

然后我试了你的测试,我想知道为什么

sage:P.weil_pairing(Q,360).乘法顺序()181鼠尾草:P.order()360鼠尾草:180*P(0 : 0 : 1)

我将对此进行错误报告。

还有两条评论:in磨坊主(),您可能应该将t初始化为self.base_ring()(1),而不仅仅是1。其次,此代码同样适用于任何字段上的有限阶点,因此您应该移动整个代码块,以便函数是EllipticCurvePoint_field的成员,而不是子类ElliptiCurvePoint_finite_field的。

我想我会在下一次迭代中做到这一点,以及您关于通过预计算d=gcd(m1,m2)和配对(m1/d)*P和(m2/d)*Q来节省时间的建议。我这个月的时间有点紧张,我认为下一次的迭代需要一些更广泛的测试。

@sagetrac-dmhansen公司
复制链接
人体模型 作者

评论:12

我会做一个错误报告。

不,我不会。鼠尾草输出正常。
对不起,现在早上有点早。weil配对结果一定是错误的。。我觉得现在做这个有点太早了。

@约翰克雷莫纳
复制链接
成员

注释:13

回复@sagetrac-dmhansen公司:

我会做一个错误报告。

不,我不会。鼠尾草输出正常。
对不起,现在早上有点早。weil配对结果一定是错误的。。我觉得现在做这个有点太早了。

同意:(0:0:1)有订单2,所以这是一致的!厕所

@sagetrac-dmhansen公司
复制链接
人体模型 作者

附件:trac_4964.patch.gz

Sage版本3.2.3,发布日期:2009-01-05

@sagetrac-dmhansen公司
复制链接
人体模型 作者

评论:14

新的补丁程序已启动。我在ElliptiCurvePoint_finite_field类中保留了配对。在未来,这应该被提升到更一般的级别,并在上述评论中指出可能的改进。此外,Modified Tate配对现在应该非常直接地实现。

@sagetrac-dmhansen公司 sagetrac-dmhansen公司 人体模型更改了标题[评论]将Weil配对添加到Sage [需要审查]将Weil配对添加到Sage 2009年2月6日
@sagetrac-dmhansen公司 sagetrac-dmhansen公司 人体模型更改了标题[需要审查]将Weil配对添加到Sage 将Weil配对添加到Sage 2009年2月6日
@约翰克雷莫纳
复制链接
成员

注释:17

附件:trac_4964a.补丁.gz

修订后的修补程序修复了该错误。我冒昧地添加了补丁trac_4964a.patch(将在trac_49 64.patch之后应用),其功能如下:

  1. 添加doctest以显示我报告的错误已修复。
  2. 按照我最初的建议,将函数移到类EllipticCurvePoint_field中,因为这工作得很好!
  3. 通过在第5个分圆域上添加一个计算5阶Weil对的docest来说明我的观点。
  4. 编辑了有关实现的文档,只适用于两个点具有相同顺序n的情况,因为实际上唯一的条件是nP=nQ=0,即它们都在e[n]中,因此该函数可以应用于任何两个扭点,前提是n是它们阶的公倍数。

如果dmhansen对这些调整感到满意,那么我对(组合)补丁感到满意,所以我乐观地对其进行了积极评价。理想情况下,第三方也会查看。

@sagetrac-dmhansen公司
复制链接
人体模型 作者

评论:18
  1. 添加doctest以显示我报告的错误已修复。
  • 伟大的!我还使用您的示例进行了类似的文档测试,以测试_磨坊主_函数实现,所以现在应该介绍一下。
  1. 正如我最初建议的那样,将函数移动到类EllipticCurvePoint_field,因为这非常有效!
  2. 通过在第5个分圆域上添加一个计算5阶Weil对的docest来说明我的观点。
  • 这真的很好。非常感谢,它只是泛化,没有任何问题,真的很酷。
  1. 编辑了有关实现的文档,只适用于两个点具有相同顺序n的情况,因为实际上唯一的条件是nP=nQ=0,即它们都在e[n]中,因此该函数可以应用于任意两个扭转点,前提是n是它们阶数的公共倍数。
  • 我同意。这一点很重要。

如果dmhansen对这些调整感到满意,那么我对(组合)补丁感到满意,所以我乐观地对其进行了积极评价。理想情况下,第三方也会查看。

我对这些变化感到非常高兴,是的,如果能得到第三方的评论,那就太好了。

@约翰克雷莫纳
复制链接
成员

附件:trac_4964b.补丁.gz

在前两个之后应用。

@约翰克雷莫纳
复制链接
成员

评论:19

谢谢。受鼓舞的是,我添加了我之前建议的另一件事,这确保了(米勒函数的)硬计算只对gcd(|P|,|Q|)进行。如果P和Q的阶数未知,则使用除以n的信息计算阶数(否则将使用组阶数,但这可能比n大得多)。一些测试表明,这确实加快了功能。

我现在想请一位新的关于sage-nt的评论员。

@鼠尾草-马绍夫
复制链接
人体模型

评论:20

将所有三个补丁合并到Sage 3.3.alpha6中。Doctests确实通过了,但如果另一个评审员再看一遍,那就好了。

干杯,

迈克尔

@约翰克雷莫纳
复制链接
成员

评论:21

回复@sagetrac-mabshoff公司:

将所有三个补丁合并到Sage 3.3.alpha6中。Doctests确实通过了,但如果另一个评审员再看一遍,那就好了。

干杯,

迈克尔

谢谢,迈克尔!约翰

免费注册 在GitHub上加入此对话.已经有帐户了吗?登录以发表评论
项目
还没有
开发

没有分支或拉请求

1名参与者