- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 40150
- 在线时间
- 小时
|
发表于 2021-10-30 12:07:49
|
显示全部楼层
利用计算对合变换的链接28#中的附件可以得出一种更一般化的有效计算方法。
还是以15#的数据为例子,我们已经转化为目标曲线为\(y=x^2\),
第一类变换曲线为\(4x^2+y^2-8y+\frac{16}5\)
更具附件中符号,对应
\(J=\begin{bmatrix}1&0&0\\0&0&-\frac12\\0&-\frac12&0\end{bmatrix}\)
以及
\(K=\begin{bmatrix}4&0&0\\0&1&-4\\0&-4&\frac{16}5\end{bmatrix}\)
矩阵\(J^{-1}K\)的特征多项式为\(x^3 - 20x^2 + \frac{576}5x - \frac{1024}5=(x-4)(x^2-16x+\frac{256}5)\)
设h为\(x^2-16x+\frac{256}5=0\)的一个根,比如\(r\approx 4.422291236...\)
记\(r_3=4,r_1=r,r_2=16-r\),根据附件结论有\(a=1-\frac{r}4, b=1-\frac{16-r}4, u_3=4,u_2=20,u_1=\frac{576}5,u_0=\frac{1024}5\)
而h=0代表基本变换,一般情况对应的变换曲线为\(K_h=h(x^2-y)+(4x^2+y^2-8y+\frac{16}5)\)。
由于h=0代表基本变换,对应椭圆曲线\(y^2=\frac{1024}5(x^3 + 20x^2 + \frac{576}5x + \frac{1024}5)\)上基本点\((0,\frac{1024}5)\)
这个曲线不适合pari/gp计算,我们选择变换\(Y=\frac{1024}5 y, X=\frac{1024}5x\),得到
\(Y^2=X^3+20\times\frac{1024}5X^2+\frac{576}5(\frac{1024}5)^2 X+(\frac{1024}5)^2)^4\)
初始迭代点\(X=0,Y=(\frac{1024}5)^2\).
在pari/gp中可以使用命令
?E=ellinit([0,20*1024/5,0,(1024/5)^2*(576/5), (1024/5)^4]);
?A=[0,(1024/5)^2];
?ellmul(E,A,2)
[-19456/25, 360448/125]
对应会原坐标x=-19/5.
所以就是两次变换的复合对应h=-19/5, 即第一类变换曲线为$K_{-19/5}$ : \(\frac15 x^2+y^2-\frac{21}5y+\frac{16}5=0\)
我们需要过$(a_0,a_0^2)=(0,0)$向这个曲线做切线,切点在(0,0)关于$K_{-19/5}$的极线\(-\frac{21}{10}y+\frac{16}5=0\)上,即$y=\frac{32}{21}$上
,即切点为\((\pm\frac{44}{21},\frac{32}{21})\)
对应切线方程\(\pm\frac{44}{105} x-\frac{121}{210}y=0\),即\(y=\pm\frac{8}{11}x\)再求和曲线\(y=x^2\)的交点,
所以得出解\(x=\pm \frac{8}{11}\),也就是获得\(|a_2|=\frac{8}{11}\), 当然这个方法的缺点是最后出来会有两个候选解,但是如果我们只需要$a_n^2$或$|a_n|$,用这方法很方便。但是如果需要判断到底那个解,那么还是需要前面类似的方法,每步迭代过程总是计算两个相邻的解再加以判断。
而这种方法还有一个好处,比如对于15#给出的数据,如果我们需要计算第$10^8$项,由于添加了模素数$10^8+7$
我们可以先计算椭圆曲线的阶
?E=ellinit([0,20*1024/5,0,(1024/5)^2*(576/5), (1024/5)^4], 10^8+7);
?ellcard(E)
99994442
也就是我们只要改为计算第$5558$项即可。
? ellmul(E,A,5558)
[Mod(53676673, 100000007), Mod(82414574, 100000007)]
对应h=53676673/(1024/5)=23406626:
Mod(23406630, 100000007)*x^2 + (y^2 + Mod(76593373, 100000007)*y + Mod(40000006, 100000007))=0
(0,0)对应的极线为y=Mod(4942312, 100000007),得出切点坐标x=Mod(17689020, 100000007)或相反数
对应切线方程y=Mod(62576473, 100000007)*x,代入方程$y=x^2$得到x=Mod(62576473, 100000007).
由此得出$a_{10^8}$是62576473或37423534而$a_{10^8}^2=99012707$
密码学中,我们喜欢采用阶数含有大素因子的椭圆曲线做加解密运算。上面的椭圆曲线阶99994442不是很好,因子太多,最大素因子不够大。
这个曲线类中,$a_n$和$-a_n$总是对称出现的,这导致阶必然是2的倍数,所以我们最好能找到的阶是一个素数的2倍。
比如我们替换上面的模$10^8+7$为下面这些素数,可以使得椭圆曲线的阶为2的倍数。
素数域 | 椭圆曲线的阶 | $2^128-44999=340282366920938463463374607431768166457$ | $2\times170141183460469231723317694944204913313$ | $2^128-36273=340282366920938463463374607431768175183 | $2\times170141183460469231747828929037523766563$ | $2^128+4641=340282366920938463463374607431768216097 | $2\times170141183460469231733791976672803792673$ | $2^128+16597=340282366920938463463374607431768228053 | $2\times170141183460469231719162321042991111529$ |
然后在这些曲线上,我们就可以改用一个整数$a_n^2$代表椭圆曲线上每两个点了。
|
|