northwolves 发表于 2023-12-9 15:45:57

Reap+Sow还可以再快上一点点:

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]]

nyy 发表于 2023-12-11 09:00:40

northwolves 发表于 2023-12-9 15:34
这个还可以快上几倍,勾股数组的斜边的通项公式

ClearAll["Global`*"];(*清除所有变量*)


我发现你比我牛逼。
sortby比sort排序要快很多!
我今天才知道

nyy 发表于 2023-12-11 09:06:11

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快很多,原因不知道*)
]


比你的代码快一点点,零点几秒吧

nyy 发表于 2023-12-11 09:11:06

northwolves 发表于 2023-12-9 15:45
Reap+Sow还可以再快上一点点:

不知道能不能用Compile,这个也许能编译成c语言,然后更快

chyanog 发表于 2023-12-14 16:49:22

本帖最后由 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

nyy 发表于 2023-12-14 20:39:26

chyanog 发表于 2023-12-14 16:49


Internal`Bag是什么意思?

nyy 发表于 2023-12-15 09:01:54

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-21 11:30:21

nyy 发表于 2023-12-8 13:42
把你的代码肢解一下,并且添加上注释,这样更容易看明白、更好维护

...

{93,476,485},{44,483,485}
这两组都是本原勾股数,但是排序有问题。
应该是{44,483,485}在{93,476,485}的前面
页: 1 [2]
查看完整版本: 如何高效产生本原勾股数组?