![]() |
1
72
毕达哥拉斯三胞胎就是一个很好的例子。
(我将坚持使用伪代码以避免语言偏差,并保持伪代码的流线型化,我不会优化诸如
版本1 :
是最糟糕的解决方案。它生成重复项,并遍历不可用的空间部分(例如每当
版本2
第一个改进来自需求
这样可以减少运行时间并消除重复的解决方案。但是,它仍然是立方的
继续研究
为了
下一个洞察是
允许
我经常遇到这种改进,除了最简单的用法(例如遍历数组),我不相信“计数循环”。 更新: 显然,我应该指出一些关于v4的东西,这些东西很容易被忽略。
下面是一组不太科学的时序(使用在我的旧笔记本电脑上的Eclipse和其他运行的东西……),其中“使用x,y,z”是通过实例化一个三值的三重对象来实现的,并把它放在一个数组中。(对于这些跑步,
“数组和映射”算法是 基本上 :
“使用平方根”算法是 基本上 :
v4的实际代码是:
注意
我会很高兴提供Java源代码的请求,为其他变化,我的时间,如果我误执行任何东西。 |
![]() |
2
40
比目前任何解决方案都快得多。通过三元树找到三连体。
在这里我们有一个公式来产生每一个原始三重态。 在上面的公式中,斜边一直在增长,所以很容易检查最大长度。 在蟒蛇中:
如果你想要所有的三元组而不仅仅是原语:
作为参考, accepted answer (in python) 12471个元素用了38秒。
只是为了好玩,把上限定为一百万
|
![]() |
3
13
您应该定义x<y<z。
另一个好的优化方法是只使用x和y并计算zsqr=x*x+y*y。如果zsqr是一个平方数(或z=sqrt(zsqr)是一个整数),则它是一个三联体,否则不是。这样,您只需要两个循环,而不需要三个循环(例如,大约快1000倍)。 |
![]() |
4
11
前面列出的生成算法
Pythagorean triplets
是否所有对幼稚方法的修改都源于基本关系?
Euclid
发现了第一个这样的关系。他决定每三个毕达哥拉斯
然后生成勾股三元组,生成相对素数正整数。
维基百科关于 Formulas for generating Pythagorean triples 包含其他此类公式。 |
![]() |
5
8
算法可以针对速度、内存使用、简单性和其他方面进行调整。
这里是一个
计算
请注意,如果要计算前十亿个三元组,那么这个算法甚至会在启动之前崩溃,因为内存不足。因此,对于n的高值,算法可能是更安全的选择。 顺便说一句,这里是塔夫卡的算法,为了我的性能测试,它被翻译成了python。它的缺陷是需要3个回路而不是2个。
|
![]() |
6
6
v.1算法单调递增
编辑
这个问题似乎还活着:)
请注意,此算法已增加
如果将算法转换为C___,在C____
所以所有的内在
当然,在Python中,实际生成的额外字节码 减慢速度 该算法与版本2相比,但我敢打赌(不检查:)V.3在C中更快。 为大家干杯:) |
![]() |
7
3
我只是把凯尔·古利昂的答案扩展了一下,这样三个字母就按押金排列,然后是最长的一边。 它不使用numpy,但需要SortedCollection(或SortedList),例如 this one
代码在 math2 module 属于 my Python library . 它是根据一系列的OEIS(代码 here 在底部),这让我 find a mistake in A121727 -) |
![]() |
8
2
我用Ruby编写了这个程序,它类似于Python实现。重要的是:
然后,您必须实现一个返回两个给定数字的最大公因数(gcd)的方法。Ruby中的一个非常简单的例子:
找到三胞胎的完整方法是:
|
![]() |
9
1
是的,有。 好吧,现在你想知道为什么。为什么不限制它使z>y?尝试
|
![]() |
10
1
旧问题,但我还是会输入我的资料。 有两种生成独特的毕达哥拉斯三倍体的一般方法。一种是按比例缩放,另一种是使用这个古老的公式。 标度基本上取一个常数n,然后乘以一个碱基三倍,假设3,4,5乘以n。所以取n为2,我们得到6,8,10我们的下一个三倍。 缩放比例
公式法使用这样一个事实:如果我们取一个数字x,计算2米,m^2+1,和m^2-1,这三个总是勾股三元组。 公式
|
![]() |
11
1
|
![]() |
12
0
第5版给乔尔·尼利。 因为x可以是'n-2'的最大值,y可以是'n-1'的最大值,范围是1..n。因为z max是n,y max是n-1,x可以是sqrt的最大值(n*n-(n-1)*(n-1))=sqrt(2*n-1),并且可以从3开始。
|
![]() |
13
0
只是检查一下,但我一直在使用下面的代码来生成毕达哥拉斯三元组。它非常快(我在这里尝试了一些例子,虽然我有点了解它们,写了自己的,回来检查了这里(2年前))。我认为这段代码正确地找到了所有的毕达哥拉斯三重奏(说出你的极限),而且速度也相当快。我用C++来制作它。 乌龙是无符号长龙,我创建了几个平方和根函数 我的根函数基本上说,如果给定数的平方根(使其成为整数(integral))的平方根不等于给定数,那么返回-1,因为它不可根。 _ Square和_-Root按照上面描述的那样做,我知道优化它的另一种方法,但是我还没有做过也没有测试过。
} 告诉我你们的想法。根据我交给的老师,它生成所有原始和非原始三元组。(如果我没记错的话,她测试了100次)。 前一个编码器提供的v4结果如下 下面是一组不太科学的时序(使用在我的旧笔记本电脑上的Eclipse和其他运行的东西……),其中“使用x,y,z”是通过实例化一个三值的三重对象来实现的,并把它放在一个数组中。(对于这些运行,n设置为10000,每种情况下产生12471个三倍。) 版本4:46秒。 使用平方根:134秒。 阵列和映射:400秒。 我的结果是 生成多少个三倍:10000 正在生成三元组,请稍候。 在2秒内生成12471。 在我开始通过编译器进行优化之前。(我记得以前我用大量的特殊选项和东西从10000秒降到0秒)。我的代码还生成了所有三个值,其中100000作为在3.2分钟内1,2,hyp可以达到的上限(我认为1000000的上限需要一个小时)。 我对代码做了一点修改,并将10000限制降到1秒(没有优化)。除此之外,仔细考虑,我的可以被分解成块,并按照给定的范围(例如100000分为4个相等的块,每3个CPU(1个额外的,以备万一,希望消耗CPU时间),范围为1到25000(从1开始,限制为25000),25000到50000,50000到75000,和75000到结束。我可以这样做,看看它是否加快了速度(我将预先处理线程,而不将它们包括在执行三重函数的实际时间内)。我需要一个更精确的计时器和连接向量的方法。我认为,如果1个3.4 GHz的CPU,有8 GB的RAM,可以在1秒钟内完成10000个LIM,那么3个CPU应该在1/3秒内完成这项任务(我会像ATM那样调到更高的秒数)。 |
![]() |
14
0
应该注意,对于A、B和C,不需要一直循环到N。
对于A,您只需要从1循环到
|
![]() |
15
0
|
![]() |
16
0
你可以试试这个
|
![]() |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
![]() |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |
![]() |
Wadu Hek · 查找列表中唯一的重复项 2 年前 |
![]() |
Crawford Patten · 如何获得整数列表的四分位数 2 年前 |
![]() |
MoonGoose · 如何在python中围绕特殊字符创建空间? 2 年前 |
![]() |
taha khamis · 在一个数字中组合元素的省道 3 年前 |
![]() |
Soup · 比O(n)更快地找到阶乘n模m 3 年前 |
![]() |
BigO · 单词积分游戏不断增加数字[关闭] 3 年前 |