From 51840bc853510c3d39a0db797f39cf6fde8ff091 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Tue, 22 Nov 2022 16:47:53 -0500 Subject: [PATCH] =?UTF-8?q?=E2=80=A2math.GCD=20and=20=E2=80=A2math.LCM=20f?= =?UTF-8?q?or=20u64=20arguments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins.h | 2 +- src/builtins/arithd.c | 38 ++++++++++++++++++++++++++++++++++++++ src/builtins/arithm.c | 4 ++-- src/builtins/sysfn.c | 2 +- 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/builtins.h b/src/builtins.h index 5d79619f..6f881265 100644 --- a/src/builtins.h +++ b/src/builtins.h @@ -17,7 +17,7 @@ /*internal.c*/M(itype,"•internal.Type") M(elType,"•internal.ElType") M(refc,"•internal.Refc") M(isPure,"•internal.IsPure") A(info,"•internal.Info") M(heapDump,"•internal.HeapDump") \ /*internal.c*/M(squeeze,"•internal.Squeeze") M(deepSqueeze,"•internal.DeepSqueeze") D(eequal,"•internal.EEqual") A(internalTemp,"•internal.Temp") \ /*internal.c*/D(variation,"•internal.Variation") A(listVariations,"•internal.ListVariations") M(clearRefs,"•internal.ClearRefs") M(unshare,"•internal.Unshare") \ -/* arithm.c*/M(sin,"•math.Sin") M(cos,"•math.Cos") M(tan,"•math.Tan") M(asin,"•math.Asin") M(acos,"•math.Acos") M(atan,"•math.Atan") D(atan2,"•math.Atan2") +/* arithm.c*/M(sin,"•math.Sin") M(cos,"•math.Cos") M(tan,"•math.Tan") M(asin,"•math.Asin") M(acos,"•math.Acos") M(atan,"•math.Atan") D(atan2,"•math.Atan2") D(gcd,"•math.GCD") D(lcm,"•math.LCM") #define FOR_PM1(A,M,D) \ /*md1.c*/A(tbl,"⌜") A(each,"¨") A(fold,"´") A(scan,"`") A(const,"˙") A(swap,"˜") A(cell,"˘") A(insert,"˝") \ diff --git a/src/builtins/arithd.c b/src/builtins/arithd.c index 211d9955..82258fb2 100644 --- a/src/builtins/arithd.c +++ b/src/builtins/arithd.c @@ -366,4 +366,42 @@ B atan2_c2(B t, B w, B x) { thrM("•math.Atan2: Unexpected argument types"); } +static u64 gcd_u64(u64 a, u64 b) { + if (a == 0) return b; + if (b == 0) return a; + u8 az = CTZ(a); + u8 bz = CTZ(b); + u8 sh = az>= bz; + while (a > 0) { + a >>= az; + u64 d = b - a; + az = CTZ(d); + b = b