go math/big:模逆运算中模数为零是未定义的

yc0p9oo0  于 6个月前  发布在  Go
关注(0)|答案(5)|浏览(44)

ModInverse为所有g值、正负n值定义,但不为零n值。
ModInverse将z设置为环Z/nZ中的g的乘法逆元,并返回z。如果g和n不是互质数,那么在环Z/nZ中,g没有乘法逆元。在这种情况下,z保持不变,返回值为nil。
模零的数字环不存在,与零互质是没有意义的,所以当前文档不涵盖这种情况。
可以认为,当模数为零时,ModInverse应该总是引发恐慌,但目前它对于g > 1返回nil,对于g = 1返回1,对于g = 0返回nil,对于g < 0引发恐慌。为了一致性而将非恐慌转换为恐慌是自找麻烦,所以我们应该始终使n = 0时的ModInverse返回nil。
这可能会破坏尝试解引用ModInverse(1, 0)返回值的程序,但这感觉是一个足够特定的条件,程序不会依赖它#famouslastwords。

tcomlyy6

tcomlyy61#

你好,@FiloSottile,我想解决这个问题。

1wnzp6jl

1wnzp6jl2#

https://golang.org/cl/342211提到了这个问题:big/int: Explicit checks in ModInverse for g modulo n=0

hwamh0ep

hwamh0ep3#

感谢你提交这个问题 @FiloSottile,也感谢你 @ok-john 发送了 CL https://go-review.googlesource.com/c/go/+/342211/
这个问题标记为 Go1.18,但是 CL 标记为 "Wait-Release"。我们应该将这个问题推迟到 Go1.19,还是应该在模数为零时进行破坏性更改,返回 nil?现在有一个保留意见是内部代码有一个注解,表示其内部实现的 GCD 期望参数大于 0。我们是否应该记录这个问题,或者等到 Go1.19?你怎么看 @griesemer@ianlancetaylor?

fnatzsnv

fnatzsnv4#

好的,我将按照CL标签将其移动到Go1.19里程碑,因为在周期的后期进行重大更改。

abithluo

abithluo5#

看起来这个没有达到1.19版本的要求。将其移动到待办事项列表中。请适当地重新归类。

相关问题