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