Clear["Global`*"];(*清除所有变量*)
Timing[max=2*10^6;
SortBy==1&&OddQ@(n+m),Sow@{m^2-n^2,2m n,m^2+n^2}],{n,(Sqrt-1)/2},{m,Range]}]][],Last]] northwolves 发表于 2023-12-9 15:34
这个还可以快上几倍,勾股数组的斜边的通项公式
ClearAll["Global`*"];(*清除所有变量*)
我发现你比我牛逼。
sortby比sort排序要快很多!
我今天才知道 northwolves 发表于 2023-12-9 15:34
这个还可以快上几倍,勾股数组的斜边的通项公式
ClearAll["Global`*"];(*清除所有变量*)
Clear["Global`*"];(*清除所有变量*)
Timing[
max=2*10^6;(*边长的最大值*)
jmax=-1+Sqrt[-1+max];(*由j^2+(j+2)^2<=2*max计算出j的最大值*)
aa=Flatten[#,1]&@Table[Sort@{(i*j),(i^2-j^2)/2,(i^2+j^2)/2},(*生成勾股数组,并排序*)
{j,1,jmax,2},(*指定j的范围*)
{i,Select,2],GCD==1&]}(*指定i的范围*)
];
bb=SortBy(*按照第三列升序排列,SortBy排序比Sort快很多,原因不知道*)
]
比你的代码快一点点,零点几秒吧 northwolves 发表于 2023-12-9 15:45
Reap+Sow还可以再快上一点点:
不知道能不能用Compile,这个也许能编译成c语言,然后更快 本帖最后由 chyanog 于 2023-12-14 16:55 编辑
cf = Compile[{{max, _Integer}},
Module[{jmax, bag},
bag = Internal`Bag;
jmax = Sqrt - 1;
Do == 1,
Internal`StuffBag],
{j, 1, jmax, 2},
{i, j + 2, Sqrt, 2}];
Partition, 3]
]
];
ans = SortBy, Last]; // AbsoluteTiming
Length
{0.305319, Null}
318320 chyanog 发表于 2023-12-14 16:49
Internal`Bag是什么意思? chyanog 发表于 2023-12-14 16:49
Clear["Global`*"];(*清除所有变量*)
cf=Compile[{{max, _Integer}},
Module[{jmax,aa,i,j},(*指定局部变量*)
jmax=-1+Sqrt[-1+max];(*由j^2+(j+2)^2<=2*max计算出j的最大值*)
aa=Flatten[#,1]&@Table[Sort@{(i*j),(i^2-j^2)/2,(i^2+j^2)/2},(*生成勾股数组,并排序*)
{j,1,jmax,2},(*指定j的范围*)
{i,Select,2],GCD==1&]}(*指定i的范围*)
]
]
]
bb=SortBy,Last]// AbsoluteTiming;(*按照第三列升序排列,SortBy排序比Sort快很多,原因不知道*)
我的代码错在什么地方? nyy 发表于 2023-12-8 13:42
把你的代码肢解一下,并且添加上注释,这样更容易看明白、更好维护
...
{93,476,485},{44,483,485}
这两组都是本原勾股数,但是排序有问题。
应该是{44,483,485}在{93,476,485}的前面
页:
1
[2]