蒙哥马利乘法

2014年7月29日

[有人知道用纯HTML编写a-bar和b-bar的正确方法吗?LaTeX符号是\={a}和\={b},但WordPress渲染LaTeX效果很差,我更喜欢纯HTML。修复了!感谢Jussi,他建议编写amp hash x304分号和b amp hax x304分名。]

蒙哥马利乘法是一种计算方法ab公司模块对于正整数,b条,设计用于有许多乘法要执行的情况mod使用少量乘数;特别是,它对计算很有价值x个模块对于大型蒙哥马利乘法是由彼得·蒙哥马利于1985年发明的文章。我们今天的练习将使用蒙哥马利方法实现模乘和求幂。

蒙哥马利乘法的基本思想是通过转换模来消除模运算中固有的除法到更大的模量第页,带gcd(第页,)=1,其中第页是2的幂;因此,除法被渲染为位掩码。第页是2的幂,模量必须是奇数才能满足gcd要求;我们还需要两个乘法器b条小于那么蒙哥马利算法如下:

  1. 查找两个整数第页−1'这样r(右)−1 ′=1。特别是,使用的算法是不执行除法的二进制版本的算法。
  2. 将乘数乘以第页(使用左移)并降低产品模数因此,ā=一个r模块和b̄=b个r模块。这些操作很昂贵,但对于乘法链中的每个乘法器,它们只执行一次。
  3. 执行蒙哥马利乘法:计算u个=一个b r模块按操作顺序

    t吨=甲*乙
    u个= (t吨+ (t吨*'修改第页) *) /第页
    如果(u个)然后减去u个

    唯一的划分是右移;最后的结果使用减法而不是除法,因为已知乘积小于2.

  4. 通过以下公式将蒙哥马利空间的结果转换回普通整数ab公司=用户−1模块.

蒙哥马利指数运算也类似。要计算x个模块,选择第页,计算第页−1',翻译x个在蒙哥马利空间中,使用蒙哥马利乘法的平方和乘法,在蒙哥马利空间中从1开始进行幂运算,然后将结果从蒙哥马里空间转换回来。这比没有Montgomery乘法的计算要快得多,因为初始化Montgomery空间的成本是通过多次乘法分摊的,每次乘法都避免了模运算符的固有除法。

您的任务是编写执行蒙哥马利乘法和求幂的函数。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

数字单词

2014年7月25日

今天的练习是来自职业杯。当我第一次看到这个练习时,我以为它会很容易,但我在写解决方案时遇到了困难,所以也许它对所有读者来说也是一个很好的练习:

给定一个正整数,使用映射1->a、2->B、…、26->Z返回整数可以用字母表示的所有方式。例如,数字1234可以用单词ABCD、AWD和LCD表示。

你的任务是编写程序,从数字中生成单词。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

最大和路径

2014年7月22日

有时在编程实践中,我们会在计算机科学课上发布家庭作业中的练习,有时我们会发布基于欧拉项目问题或与之相关的练习,有时候我们会发布以常见技术面试问题为基础的练习。今天我们成功了:这是一个常见的面试问题,在计算机科学课上经常被布置为家庭作业,也出现在了Project Euler上(两次!):

给定一个节点中存储整数的二叉树,求出从根到叶的任何路径的最大和。

例如,在下面所示的三角形表示的二叉树中,最大和路径从根的3到它的子节点7,再到它的孙节点4,再到叶节点9,总和为23。由于没有其他路径具有更大的总和,因此最大总和为23:

   3
  7 4
 2 4 6
8 5 9 3

你的任务是编写一个程序来计算通过二叉树的最大和路径;还要编写返回路径的程序变体。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

费马因子整数

2014年7月18日

生活在计算机时代,我一直对计算机出现之前可以做多少算术感到着迷。埃及人在建造金字塔时就知道农民的乘法。阿基米德在基督诞生前两个世纪就知道圆周率的值,现在仍在使用近似值。Heron在两千年前就有一个计算平方根的算法。等等。

在费马、欧拉和高斯时代,算术是用简单的算法、经验法则和大表格完成的。可悲的是,表格经常出错;查尔斯·巴贝奇(Charles Babbage)发明了差分引擎(Difference Engine),用于自动构建精确的表格。

我们在前面的练习中研究了费马整数分解算法:

函数fermat(n)
x:=楼层(平方米(n))
r:=x*x-n
t:=2*x+1
而r不是正方形
r:=r+t
t:=t+2
x:=(t-1)/2
y:=平方(r)
返回x-y,x+y

但费马实际上是如何实现他的算法的呢?除了基本的算术之外,他还使用了一些简单的规则来识别正方形,并使用了一个类似于下一页,最大的正方形至少与n个.

让我们考虑n个例如=13290059。首先,费马通过试验划分删除了小因子,比如小于30或50的因子。然后,费马抬起头来n个在表中。如果n个出现在表体中,那么它就是一个完美的平方,平方根就是它的因子。但在一般情况下,费马发现x个作为表中下一个较小条目的平方根。对于13290059,x个=3645,因为36452< 13290059 < 36462.然后t吨=7291和第页=-4034,这不是一个完美的正方形(因为它是负数)。

现在迭代开始了。费马计算第页t吨按照以下45个步骤,首先第页,然后t吨下面是一条求和线,然后是求和第页=第页+t吨,然后t吨比上一个增加2t吨,然后是求和行,然后是新的求和第页,在每个步骤检查第页是一个正方形:

0:r=-4034=3645*3645-13290059t=7291=2*3645+1------1:r=3257以7结尾;不是正方形t=7293=7291+2------2:r=10550以50结束;不是正方形t=7295=7293+2------3:r=17845以45结束;不是正方形...44:r=318662以2结尾;不是正方形t=7381=7379+2------45:r=326041,表571*571

此时,费马可以计算n个:x个=(7381–1)/2=3690,=571,以及系数n个x个负极=3690−571=3119和x个+= 3690 + 571 = 4261.

费马计算的关键是确定案例第页是一个正方形。费马使用了三条规则:首先,数字的最后两位必须是00,电子1,电子4, 25,o(o)6或电子9,其中电子是任意偶数o(o)是任意奇数。其次,数字的数字根必须是1、4、7或9:n个; 如果结果小于10,则返回数字和,否则返回数字和的数字根。实际上,这比“剔除九”要快得多n个或结果。第三,如果他还没有确定这个数字不是一个正方形,他会在他的方格表中查找它。整个计算过程比我在这里描述的要快得多。

这就是费马计算整数的方法。当然,有时他会失败,因为他需要多次迭代才能找到一个正方形,或者他的方格表太小,或者他在算术中出错。幸运的是,他很容易通过乘以因子来确认他发现的任何因子分解都是正确的。

你的任务是编写一个程序,用与费马计算整数相同的方法计算整数。完成后,欢迎您阅读运行建议的解决方案,或者在下面的评论中发布你自己的解决方案或讨论该程序。

页:1 2

我们在小学时都学会了乘法表。例如,下面是标准的9乘9乘法表:

1  2  3  4  5  6  7  8  9
2  4  6  8 10 12 14 16 18
3  6  9 12 15 18 21 24 27
4  8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

该表有36种不同的产品:1、2、3、4、5、6、7、8、9、10、12、14、15、16、18、20、21、24、25、27、28、30、32、35、36、40、42、45、48、49、54、56、63、64、72和81。

您的任务是编写一个程序来计算n个通过n个乘法表。有一个明显的O(n个2)算法;你能做得更好吗?完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

FSM发生器

2014年7月11日

几周前,我们有一个运动这解决了从字符串中删除给定字符的单次出现而保留给定字符的多次出现的问题。我们的解决方案使用了一个有限状态机,该状态机在输入字符串上迭代写入输出。

该解决方案中使用的有限状态机是手工创建的,用于解决给定的问题。但是,可以编写一个程序,该程序接受有限状态机的定义,并创建一个函数,该函数接受输入字符串并将有限状态机应用于它。这样的程序不难创建,并且为小型解析问题提供了有用的实用程序。

你的任务是编写一个程序,从一个简单的描述中生成一个有限状态机;机器的格式和功能由您决定,但它至少应该足够强大,可以解决“删除单例”问题。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

SQUFOF,续分数版

2014年7月8日

平方形式因式分解(SQUFOF)是一种特殊的整数因式分解方法。它通常用于在二次筛和数字域筛因子分解算法的双大时间变量中分割小半素数。我们研究了SQUFOF在上一次练习; 今天我们研究SQUFOF的“连分数”变体。

虽然SQUFOF的数学基础是高斯的二次型,但SQUFO是由Daniel Shanks在研究连续分式分解算法的失败时发现的;你应该读他的纸张这是我读过的最好的数学发现过程的演示。Shanks算法扩展了n个,该数被分解,在收敛点之间搜索作为完美平方的二次形式;在这一点上,它不同于CFRAC算法,该算法将多个收敛点组合成一个完美的正方形。我们从纸张Jason Gower和Sam Wagstaff提供了SQUFOF的标准描述:

[注:在以下描述中,注意区分符号; 第一个在,第二个没有。有些浏览器会以可读的方式显示“复合扬抑符”,但有些则不然。在我可以使用的浏览器上,只有四分之一的浏览器能够清晰地显示符号,大概只有当我将字体扩展到相当大的时候。如果有疑问,请查看下一页上的程序,其中第一个符号被命名为qhat(qhat)第二个符号命名为q个. ]

变量N个是要因子化的整数,S公司记得q个0,q个保持电流q个,P(P)P’保持两个连续值P(P),保持两个连续值、和t吨是用于更新的临时变量最后,B类是算法放弃之前测试的平方形式数量的上限。

1.初始化:读取奇数正整数N个需要考虑因素。如果N个是整数的平方,输出平方根并停止。如果N个≡1 mod 4,然后设置2N个; 否则,设置N个.在任何情况下,请设置S公司← ⌊√⌋,̂ ← 1,P(P)S公司,负极P(P)·P(P),L(左)← ⌊2√2√⌋,B类2 ·L(左)、和0

2.向前循环以找到合适的正方形:重复步骤2a至2e= 1, 2, 3, ….

2a:设置q个← ⌊(S公司+P(P)) /⌋和P’q个·负极P(P).

2b页:如果,然后:

如果是平的,把这对放进去(/ 2,P(P)模块(/2)进入队列;否则,如果L(左)/2,然后把这对(,P(P)模块)在队列上。

2c码:设置t吨̂ +q个· (P(P)负极P’),̂ ←t吨、和P(P)P’.

第2天:如果很奇怪,请转至步骤2e。如果不是整数的平方,请转至步骤2e。否则,设置第页← √,是一个正整数。如果没有配对(第页,t吨)在队列中第页划分P(P)负极t吨,然后转至步骤3。如果第页>1,有一对(第页,t吨)在队列中第页划分P(P)负极t吨,然后删除从QUEUE开始到并包括该对的所有对,并转至步骤2e。如果第页=1,有一对(1,t吨)在QUEUE中,算法失败,因为我们已经遍历了判别式4的二次型的整个主周期N个没有找到合适的平方形式。

2e:+ 1. 如果>B类,放弃。否则,转至步骤2a。

3.计算平方根的反比:设置̂ ←第页,P(P)P(P)+第页· ⌊(S公司负极P(P)) /第页⌋,以及(负极P(P)·P(P)) /̂.

4.沿相反方向循环,以找到系数N个:

4a:设置q个← ⌊(S公司+P(P)) /⌋和P’q个·负极P(P).

4b:如果P(P)=P’,然后转至步骤5。

4c:设置t吨̂ +q个· (P(P)负极P’,̂ ←,t吨、和P(P)P’并进入步骤4a。

5.打印系数N个:如果是偶数,设置/ 2. 输出因子属于N个.

随后,在论文的第5.2节中,Gowers和Wagstaff给出了使用乘数的说明以帮助找到N个,将上述算法更改如下:

将步骤1更改为:读取奇数正整数N个需要考虑因素。如果N个是整数的平方,输出平方根并停止。如果百万牛顿≡1 mod 4,然后设置2百万牛顿; 否则,设置百万牛顿。在任何情况下,请设置S公司← ⌊√⌋,̂ ← 1,P(P)S公司,负极P(P)·P(P),L(左)← ⌊2√2√⌋,B类2 ·L(左)、和0

将步骤2b更改为:Let/gcd公司(,第2页). 如果L(左),放置(,P(P)模块)在队列上。[注:如果你正在阅读Gowers和Wagstaff论文的链接版本,这个公式错误地给出为(,B类模块); 那个错误让我痛苦了好几个小时。]

在步骤5中,更换通过/gcd公司(,第2页)在因子之前是输出。

要找到系数,首先使用乘数= 1. 如果这样做失败,请尝试另一个乘数,从集合3、5、7、11、3·5=15、3·7=21、3·11=33、5·7=35、5·11=55、7·11=77、3·5·7=105、3·11=165、3·7·11=231、5·7·11=385、3·7.11=1155,或任何其他小奇数素数的无平方积。

您的任务是使用乘数实现SQUFOF。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

最小值和最大值

2014年7月4日

我们今天有一个两部分的采访问题:

首先,编写一个程序,它接受一个整数数组,并返回数组的最小和最大元素。尽可能少地进行比较。

其次,编写一个程序,获取一个整数数组,并返回该数组的第二个最小和最大元素;即第二小元素和第二大元素。同样,尽可能少地进行比较。

您的任务是编写上述两个程序,并说明在一般情况下每个程序的比较次数;确保它们能够抵御恶意输入。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

月色,月色

2014年7月1日

我们以前研究过日出和日落的时间以及月亮的相位。今天我们来看看月出和月落的时间。

天文计算的标准来源是海军天文台; 他们指向1989年的一篇文章天空与望远镜用于计算。文章不在网上,但代码是:一个非常丑陋的BASIC程序,在下一页.

你的任务是编写一个计算月出和月落时间的程序。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2