如何在Sympy求和过程中实现变量的自动迭代更新?
如何在Sympy求和过程中实现变量的自动迭代更新?
看起来你是在椭圆曲线上做标量乘法,现在想把手动重复调用add的逻辑改成用Sympy的符号化方式自动迭代更新result变量对吧?我来帮你调整代码,用Piecewise实现每一步的状态累积,让result自动随着迭代步骤更新:
问题分析
你当前的multiply函数里手动写了三次add调用,这种硬编码的方式既不灵活也不通用。我们需要把标量乘法的迭代过程改成递推式的符号化定义,用Piecewise来区分不同迭代阶段的result状态,让Sympy可以自动处理每一步的更新。
修改后的代码
from sympy import symbols, summation, Piecewise, invert, Function x = symbols("n") def add(P1_c, P2_c, p, k): if P1_c == 0: return P2_c # P1 is the point at infinity if P2_c == 0: return P1_c # P2 is the point at infinity x1 = P1_c % k y1 = P1_c // k x2 = P2_c % k y2 = P2_c // k if x1 == x2 and y1 != y2: return 0 if x1 == x2 and y1 == y2: m = (3 * x1**2 * invert(2 * y1, p)) % p else: m = ((y2 - y1) * invert(x2 - x1, p)) % p x3 = (m**2 - x1 - x2) % p y3 = (m * (x1 - x3) - y1) % p # Return combined number return x3 + k * y3 def multiply(P_c, scalar, p, k): current = P_c # 用Sympy函数定义递推的result状态 Result = Function('Result') # 用Piecewise定义不同标量下的result: # 1. 标量为0:返回无穷远点(群的单位元) # 2. 标量为1:直接返回当前点(只需要加一次) # 3. 标量大于1:递推计算scalar-1倍点 + 当前点,实现自动迭代更新 result_expr = Piecewise( (0, scalar == 0), (add(0, current, p, k), scalar == 1), (add(multiply(P_c, scalar - 1, p, k), current, p, k), scalar > 1) ) return result_expr # 椭圆曲线参数保持不变 k = 2**256 p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F Gx, Gy = ( 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8) G_c = Gx + k * Gy # 计算x倍的G点(x是符号变量) logic = multiply(G_c, x, p, k) # 求和x从1到1,也就是计算1倍的G点 result2 = summation(logic, (x, 1, 1)) print(result2)
代码说明
- 递推式的
Piecewise定义:- 我们用
Piecewise把标量乘法的不同情况拆分开,自动处理初始状态和每一步的迭代更新,完全替代了之前手动写多次add的硬编码逻辑。 - 当你传入符号变量
x作为标量时,Sympy会自动识别递推关系,生成对应的符号化表达式。
- 我们用
- 灵活性提升:
现在你可以传入任意标量(不管是数值还是符号变量),multiply函数都会自动执行对应次数的add操作,不需要手动修改函数内部的调用次数。 - 求和与迭代的绑定:
当你用summation对符号变量x求和时,每一次求和项都会对应一次result的递推更新,完美实现了你想要的“每一步求和自动更新result”的需求。
额外提示
如果你之前手动加三次是为了测试3倍点的计算,只需要把求和上限改成3,或者直接传入scalar=3即可:
# 计算3倍的G点 result3 = multiply(G_c, 3, p, k) print(result3)
备注:内容来源于stack exchange,提问作者user27394478
相关产品推荐
相关产品推荐

