这里有几个问题。首先,你有错误的公式:这些公式是求和的求反的公式,或者相当于曲线的第三个点,它位于P和Q的直线上。与你在Wikipedia上链接的公式相比,你会发现你得到的Z.y是它们的值的否定。在
第二个问题是你的公式没有考虑原点:如果p是群定律中Q的逆,那么p+Q就是原点,它不在曲线的仿射部分,因此不能用(x, y)坐标来描述。所以你需要一些方法来指定原点。在
让我们写一些代码。首先,我们需要曲线上点的表示。我们使用字符串'Origin'来表示原点,并使用一个简单的命名元组来表示椭圆曲线的仿射部分上的点。在# Create a simple Point class to represent the affine points.
from collections import namedtuple
Point = namedtuple("Point", "x y")
# The point at infinity (origin for the group law).
O = 'Origin'
为了演示的目的,我们选择了一条特殊的椭圆曲线和素数。素数应该大于3才能使加法公式有效。我们还编写了一个函数,可以用来检查某个特定点是否是曲线上某个点的有效表示。这将有助于检查我们在实现加法公式时没有犯任何错误。在
^{pr2}$
要对模p进行除法,您需要一些方法来计算模p的逆数。这里一个简单而有效的技巧是使用Python的pow函数的三参数变量:根据Fermat的小定理,pow(a, p-2, p)将给出a模p的逆(当然前提是该逆存在,即a不能被{}整除)。在def inv_mod_p(x):
"&#