椭圆曲线分解

2009年7月31日

在上一个运动我们在椭圆曲线上编写了一个小函数库。今天,我们将使用椭圆曲线执行整数因式分解。本练习中的材料基于本书第二版中的讨论编码理论密码学导论韦德·特拉普和劳伦斯·华盛顿。

用一个例子来解释这个算法是最容易的。考虑数字的因式分解n个=pq值= 2773. To因子n个,我们随机选择一条椭圆曲线2x个+ 4x个+4(mod 2773),其中模量是要计算的数字。当然,这并不是一条真正的椭圆曲线,因为一条真正椭圆曲线的模必须是素数,以便我们计算所需的模逆,以确定曲线上两点连线的斜率。椭圆曲线算法正是利用了这一事实。

接下来,我们选择曲线上的一个点;在这种情况下P(P)=(1,3)工作正常。实际上,更容易选择参数在0≤范围内随机<n个,设点为(1,1),然后b条参数只是–,但您可以随意选择参数,只要b条x个均在0≤范围内<n个以及要点(x个)在曲线上。

现在我们开始一系列椭圆加法。第二点P(P)是(1771705)。接下来,我们尝试计算3P(P),但失败了。穿过点2的线P(P)=(1771705)和P(P)=(1,3)是705–3除以1771–1,即梯段上方的坡度,但gcd(17702773)=59,因此我们无法反转1770来计算线路坡度。我们发现了一个不在椭圆曲线上的点。当然,这正是我们想要做的;59是2773=59×47的系数。

根据中国剩余定理,曲线2x个+ 4x个+4(mod 2773)可视为一对椭圆曲线,一条具有模量59,另一条具有模数47。第3点P(P)存在模量47,但不存在模量59。这就是椭圆曲线因式分解的工作原理,允许我们分离因子59。

因此,基本的椭圆曲线因式分解算法是选择一条模为因子数的随机椭圆曲线(实际上是一条伪椭圆曲线)和曲线上的一个随机点,然后重复建立随机点的倍数,直到椭圆算法失败,在这个点上可以识别因子。这里描述的算法是一种大大简化的椭圆曲线因式分解形式,旨在教授基本概念,而不是创建一个有用的程序;我们很快就会看到更好的算法版本。

您的任务是编写一个使用上述椭圆曲线算法执行整数分解的函数。使用您的函数计算455839的系数。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布解决方案或讨论练习。

页:1 2

椭圆曲线算法

2009年7月28日

图片由Jean Brette提供。根据Creative Commons Attribution 3.0 Unported许可证授权。椭圆曲线在数学上很奇怪。椭圆曲线最初起源于测量椭圆下面积的椭圆积分,它与代数、几何学和数论有关。椭圆曲线是费马最后一个定理的证明,目前用于整数因式分解和密码学。我们将在未来的练习中看到椭圆曲线的应用;今天的任务是计算椭圆曲线的基本算法。椭圆曲线的简单定义是它提供了广义三次方程的所有解。

椭圆曲线的标准形式是2=x个+斧头+b条; 我们也可以写Eb条任何在两个变量中为三次方的公式都可以通过适当的转换重写为这种形式。除了x个由公式定义的点,椭圆曲线包括一个“无穷远点”,用∞表示,类似于艺术家的“消失点”,允许他在二维画布上描绘三维图像。我们只考虑椭圆曲线,其中判别式4+ 27b条2非零,表示椭圆曲线没有尖点或自相交。

椭圆曲线上的标准操作是两个点的相加,如图所示;当然,这与平面上两点的矢量相加不同。几何上,点P(P)可以通过在它们之间投影一条线并找到“第三点”来添加R(右)直线与曲线相交的位置,即该点的负值P(P)+,如右图所示,由Jean Brette绘制。此外,无穷远处的点是加法的单位元,因此P(P)+ ∞ = ∞ +P(P)=P(P)对于任何一点P(P)在椭圆曲线上。加法既有结合性又有交换性。

椭圆曲线的加法律为:

给出的分数P(P)1= (x个11)和P(P)2= (x个22),重点P(P)= (x个) =P(P)1+P(P)2,其中点P(P)1P(P)2P(P)位于椭圆曲线上2=x个+斧头+b条带非零判别4+27个b条2,可以计算为

    x个=2——x个1——x个2

    =1+(x个——x个1)

其中斜坡

    = (3x个12+a)/(2)1)

如果P(P)1=P(P)2

    = (1——2) / (x个1——x个2)

否则。

椭圆曲线上连接两点的直线的斜率按常规方法计算,即上升差除以运行差,但如果两点相同,则连接两点的线是曲线的切线。减法是负数的加法,其中(x个)是(x个-年). 椭圆曲线上的乘法只是重复加法,就像正则算术一样。

我们一直在讨论实数上的椭圆曲线,但这些公式在包含相对于模的整数的有限域上非常有效。斜率计算中的除法是乘以模逆,因此模必须是素数。我们之前的运动关于模运算将很有帮助。

一个简单的例子可能会让事情变得清楚。考虑椭圆曲线2x个+ 4x个+4(模块5)。曲线上有八个点:(0,2)、(0,3)、(1,2)、;这些点可以通过用0、1、2、3和4替换x个计算模平方根。请注意,当x个=3没有解,因为27+12+4≡43≡3(mod 5)没有平方根,当x个=2只有一个解,8+8+4≡20≡0(mod 5),0的平方根为0,与模量无关。点(1,2)和(4,3)之和为(4,2),点(1,3)的负值为(1,3。

您的任务是为有限域上的椭圆曲线编写一个函数库。你的库应该提供加法、求反、减法、加倍和乘法的函数;您可能希望将正常点表示为三元组(x个 1) 无穷远处的点是三元组(0 1 0)。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布解决方案或讨论练习。

页:1 2

让我们达成协议!

2009年7月24日

让我们达成协议!是一个电视游戏节目,起源于20世纪60年代的美国,此后在全世界制作。在其中一场比赛中,奖品放在三扇门后,参赛者被要求选择一扇门;一扇门藏着一辆汽车,另外两扇门藏了山羊。然后主持人,谁知道门后是什么,打开了选手没有选的一扇门,每一扇门都露出一只山羊,并问你是否想换扇门。更换你选择的门对你有利吗?

你的任务是编写一个程序来模拟大量的游戏,并确定切换门是否对你有利。你通过换车赢得汽车的几率有多大?完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布解决方案或讨论练习。

页:1 2

Pollard的P-1分解算法

2009年7月21日

费马小定理指出,对于任何质数第页,以及任何其他数字一a^{p-1}\equiv1\pmod{p}.重新安排条款a^{p-1}-1\equiv0\pmod{p},这意味着第页除以方程式的左侧,因此第页是左侧的一个因素。

约翰·波拉德(John Pollard)在1974年利用这个想法开发了一种因子分解方法。他的想法是选择一个非常大的数字,看看它是否与a^{p-1}-1,因此给出了一个系数第页测试许多非常大的数字的系统方法是采用大阶乘,其中包含许多小因子。因此,波拉德的第1页分解算法如下:

1) 选择b条,被称为平滑边界,并计算素数的乘积b条通过k=\mathrm{lcm}(1,2,3,\ldots,b).

2) 选择一个随机整数一这样的话1<a<n.

3) 计算g=\gcd(a,n).如果克严格大于1,则为非平凡因子n个。否则,继续下一步。

4) 计算d=\gcd(a ^k-1,n).如果1<d<n,然后d日n个.如果d=1,转到步骤1并选择较大的b条.如果d=n,返回步骤2并选择另一个一.

在步骤4中,如果b条变得太大,“太大”可能就在附近10^6; 在这种情况下,您需要继续使用其他因子分解算法。

您的任务是编写一个通过Pollard的第1页方法。哪些因素2^{98}-1? 完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布您的解决方案或讨论练习。

页:1 2

奥林匹克数学竞赛

2009年7月17日

最近国际数学奥林匹克竞赛的这三个问题突然出现在网络上。

IMO 1960问题01

确定所有具有N可被11整除性质的三位数N,并且N/11等于N的位数的平方和。

IMO 1962问题01

找出具有以下性质的最小自然数n:

(a) 它的十进制表示法的最后一位是6。
(b) 如果最后一个数字6被擦除并放在其余数字的前面,则得到的数字是原始数字n的四倍。

IMO 1963问题06

五个学生,A,B,C,D,E,参加了一场比赛。一个预测是参赛者将按照ABCDE的顺序完成比赛。这一预测非常糟糕。事实上,没有一名选手在预测的位置上完成比赛,也没有两名选手预测会连续完成比赛。第二个预测是选手按照DAECB的顺序完成比赛。这个预测更好。准确地说,两名参赛者在预测的位置完成了比赛,而两对不相交的学生被预测会连续完成比赛。确定参赛者完成比赛的顺序。

你的任务是解决这三个问题。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布解决方案或讨论练习。

页:1 2

每日密码

2009年7月14日

许多报纸每天都会发布一个密码;例如:

P OYUUAOEXYW YM AEFGAD、FZGPEAG JAATUL、MYC ENA AGFOPEXYW PWG AWSYLVAWE YM ENA DPHHL ZCYCPVVAC

解密后的密码通常是一位著名作家的名言,通常是日常生活中的建议或一句精辟的话。从密码学上讲,这些拼图是单字母替换密码,26个明文字母中的每一个都被一个密文字母系统地替换。

您的任务是编写一个程序来解密每日密码,并使用该程序读取上述消息。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

黄金练习

2009年7月12日

版权所有eyehook.com。根据知识共享署名2.5许可证使用。周二将发布的练习将是《编程实践》杂志上发布的第五十次练习,这是我们的黄金纪念日。感谢所有读者,尤其是那些贡献代码和其他评论的读者,让这个博客变得特别。我总是很高兴收到我的读者的来信,尤其是如果他们为一个练习(提示,提示)贡献了一个想法。写这些练习很有趣,但也有很多工作要做,你的贡献是值得的<grin>我可以看出这个博客开始成功了,因为我必须手动删除的垃圾评论现在超过了垃圾评论</咧嘴笑>

周二的演习还将改变演习的结构。建议的解决方案将在练习后48小时发布的另一页上。这使普通读者有机会在不受建议解决方案影响的情况下制定自己的解决方案。评论将附在练习后,而不是解决方案。

我们的前五十个练习开发了几个主题:涉及素数和密码学的相关练习序列,三元搜索尝试等数据结构练习和模运算等算法练习,一些练习简单,另一些练习不那么简单,以及数独和费曼等谜题。接下来的50个练习将更加相同,包括一些相关练习的新序列、一些老朋友以及一两个奇怪的谜题。我总是乐于接受建议!

为了庆祝我们的黄金周年纪念日,周二的练习将比平时更有雄心壮志,所以请让这些编译器加快速度。快乐编码!请享用一块虚拟周年纪念蛋糕!

现在,我可以请求你的帮助吗。我想把这个网站从wordpress.com转移到它自己的主机上,仍然运行wordpress软件,这样我就可以最终修复主题,更重要的是,自动化一些我目前手工完成的流程(还有一些我根本没有完成的流程)。但我以前从未写过博客,也没有托管、迁移域注册或维护WordPress安装的经验。如果有读者想提供建议,请联系我programmingpraxis@gmail.com.

黄金比例

2009年7月10日

最近我在帮女儿做数学作业,在连续分数中遇到了这个问题:

1+\压裂1{1+\裂缝1{1+/裂缝1{1+\裂缝1{1+\frac1\ldots}}}}

这一部分可以被视为一系列术语

G_0=1

G_1=1+{1\超过1}=2

G_2=1+{1\超过1+{1\超过1}}={3\超过2}

G_3=1+{1\over 1+{1_over 1+1+{1_ over 1}}}={5\over 3}

或者,一般来说

G_{n+1}=1+\压裂1{G_n}

序列的前十个元素是1、2、3/2、5/3、8/5、13/8、21/13、34/21、55/34和89/55。

您的任务是编写一个计算n的程序第个序列的元素。它的价值是什么G_{200}型? 完成后,您可以阅读运行一个建议的解决方案,或者发布你自己的解决方案或在下面的评论中讨论练习。

页:1 2

模块算术

2009年7月7日

模运算是数论的一个分支,它本身是有用的,在整数分解、历法和天文计算以及密码学等学科中也是一种工具。卡尔·弗里德里希·高斯在他的书中将模运算系统化算术研究1801年出版。

模运算是一种整数运算系统,其中所有结果都表示为小于模的非负整数。模运算的一个常见用法是十二小时钟,九点后八小时为五点;即9+8≡5(mod 12)。模运算中使用的≡符号表示同余,而不是等式。如果两个数之差是模的偶数倍,则它们在给定模中是同余的;例如17≡5(mod 12)。模加法类似于常规加法,但在模上“缠绕”。模减法是模加法的逆运算,模乘只是重复的模加法;例如4−9 lect 7(mod 12)和3×7 lect 9(mod 12)。

模除是模乘的逆运算,正如正则除法是正则乘法的逆运算一样。在模运算中,整数的模逆第页那是整数吗q个对于其中第页×q个≡1(modn个); 模逆是未定义的,正如被零除也是未定义的一样,除非目标数与模互素。扩展欧几里德算法计算逆;鉴于斧头+通过==gcd(x个),何时=1和x个> 0,b条(修订版x个)和(修订版)是的倒数吗(修订版x个)和x个(修订版)分别是。那么模除就是模乘的逆运算。例如,9÷7≡3(模12)。

模运算中的指数运算是重复的模乘,正如指数运算是普通运算中的重复乘法一样。模幂运算可以通过首先计算幂运算,然后执行模运算来实现,但这可能需要一个较大的中间结果。更好的方法是在每次乘法时执行模运算,如有可能,进行平方运算,以减少中间乘法的数量。

在模运算中,平方根被定义为与自身相乘时等于目标数的数字,就像在普通算术中一样。就像在普通算术中一样,每个平方根在零的“另一边”都有一个共轭,除了在模运算中没有零的“另外一边”,所以这两个共轭是彼此的负值,与模相加。例如,18(mod 31)的平方根是7和24,因为7×7≡18(mod31)和24×24≡18。

在模运算中,平方根是一个比常规运算更困难的概念,因为在许多情况下模平方根是不存在的。例如,考虑正方形x个2(型号13),0≤x个<13:0、1、4、9、3、12、10、10、12、3、9、4、1。模13的平方不能等于7,因此模13的7的平方根不存在;模13的平方根只有1、3、4、9、10和12,或者等价地是±1、±3和±4。另一个限制是,只有当模是奇数素数时,才定义模平方根。例如,考虑正方形x个2(mod 15),0≤x个< 15: 0, 1, 4, 9, 1, 10, 6, 4, 4, 6, 10, 1, 9, 4, 1. 数字4有两组共轭平方根:±2和±7。由于解不是唯一的,当模量为复合模量时,可以说模平方根不存在。

如果你需要复习一下支持模运算的数学,你可以查阅任何数论教科书,或在网上搜索模运算、bezout恒等式、模逆、雅可比符号和二次剩余等术语。

您的任务是编写一个库,为模块算术的基本操作提供方便的访问:加法、减法、乘法、除法、求幂和平方根。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

Playfair密码

2009年7月3日

最著名的经典密码之一是普莱费尔密码,由查尔斯·惠斯通爵士于1854年发明,但由里昂·普莱菲尔勋爵推广。该密码在波尔战争和第一次世界大战期间被英国人使用,直到第二次世界大战时仍被用作现场密码,可能是因为它教学简单,使用速度快,不需要特殊设备,并且按照当时的标准来说相当安全;等到敌方密码分析人员能够破译消息时,消息的内容对他们来说已经毫无用处了。

Playfair使用包含密码的5平方块;将字母J映射到I,以使26位字母适合5平方块。密码首先填充到5平方块中,然后字母表的其余字母完成5平方块,去掉重复项。例如,密码PLAYFAIR指向这个5平方块:

损益表
I R B C D系列
E G H K米
不合格标准
U V W X Z

Playfair的一些变体省略了Q而不是J,或者从右下角开始按键并向后操作;我们将坚持标准方法。

要加密的消息被分为几个数字,其中J映射到I。此外,任何数字都不能使用同一个字母两次,因此如果需要,可以插入X(一些Playfair变体使用Z或Q而不是X)。同样,如果最后一个数字只有一个字母,则在消息末尾添加一个X。例如,纯文本编程PRAXIS分为:

PR OG RA MX MI NG PR AX是

然后根据以下规则分别对每个数字进行加密:

  1. 如果数字组合中的两个字母在同一行中,它们将被紧邻其右侧的字母成对替换,如果需要,可以绕到行的左侧。
  2. 如果图表中的两个字母在同一列中,它们将被下面的字母成对替换,如果需要,可以绕到列的顶部。
  3. 否则,数字的第一个字母将替换为与数字第一个字母位于同一行中的字母,与数字的第二个字母位于相同列中的字母;数字的第2个字母将被与数字的二个字母在同一行的字母,以及与数字的第一位字母在同一栏中的字母替换。

例如,PR图被加密为LI,因为P和R位于不同的行和列中,而OG图则被加密为VO,因为O和G位于同一列中。完整的加密如下所示:

PR OG RA MX MI NG PR AX为
李VO BL KZ ED OE LI YW CN

因此,编码消息为LIVOBLKZEDOELIYWCN。解密只是加密的逆过程。

Playfair比简单的替换密码更安全,因为它使用数字而不是单个字母,使得简单的频率分析变得毫无意义。数字的频率分析是可能的,但与单个字母的频率分析相比,需要更多的密文,因为Playfair可以容纳600个数字,而简单替换只能容纳26个字母。手动密码分析查看常见的反向图,如REceivER和DEcodED;如果某些明文已知(例如标准消息头),则很容易恢复至少一个部分密钥。

Playfair密码最著名的使用是在1943年。大卫·卡恩(David Kahn)写道破译者:

1943年最著名的密码可能与美国未来总统J.F.Kennedy,Jr.有关。1943年8月2日,澳大利亚皇家海军志愿预备役队澳大利亚海岸观察队中尉Arthur Reginald Evans在科隆班加拉岛丛林山脊上看到了布莱克特海峡黑暗水域上的一个火焰点,所罗门人之一。他不知道日本驱逐舰“阿马吉里”号在美国海军预备役中尉约翰·肯尼迪(John F.Kennedy)的指挥下,将一艘美国巡逻艇PT-109撞成两半。埃文斯于1943年8月2日上午9点30分收到以下消息:

KXJEY UREBE ZWEHE WRYTU HEYFS公司
KREHE GOYFI WTTTU OLKSY CAJPO公司
博泰ZONTX BYBWT GONEY CUZWR
GDSON SXBOU YWRHE BAAHY USEDQ公司

翻译:

PT BOAT一比九行动失败
梅雷苏COVE西南2英里海峡X十二人团队
X请求任何信息。

海岸观测者经常使用游乐场系统。埃文斯用关键的皇家新西兰海军破译了它,并得知了肯尼迪的命运。[……]大约十小时后,晚上10点,肯尼迪及其船员获救。

您的任务是编写使用Playfair密码加密和解密消息的函数。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2