11 impl division_struct Z#
22 generic Zfrom : (a : @a -> Z#) :: numeric,integral @a
26 Zfrom : (a : @a -> Z#)
28 impl Zlike @a :: numeric,integral @a
32 const ZfromS : (s : byte[:] -> std.result(Z#, byte[:]))
34 /* generic eqZ : (a : Z#, b : @i -> bool) :: Zlike @i */
35 generic eqZ : (a : Z#, b : @i -> bool) :: numeric,integral @i
41 std.fmtinstall(std.typeof(z), zfmt)
44 const zfmt = {sb, ap, opts
45 var z : Z# = std.vanext(ap)
46 var bz : std.bigint# = (z : std.bigint#)
47 std.sbfmt(sb, "{}", bz)
52 var ba : std.bigint# = (a : std.bigint#)
57 impl division_struct Z# =
59 var ba : std.bigint# = (a : std.bigint#)
60 var bb : std.bigint# = (b : std.bigint#)
62 (q, r) = std.bigdivmod(ba, bb)
74 impl group_struct Z# =
76 var ba : std.bigint# = (a : std.bigint#)
77 var bb : std.bigint# = (b : std.bigint#)
86 var ba : std.bigint# = (a : std.bigint#)
95 var id : std.bigint# = std.mkbigint(0)
100 -> std.bigiszero((z : std.bigint#))
104 impl ring_struct Z# =
106 var u : std.bigint# = std.mkbigint(1)
110 var ba : std.bigint# = (a : std.bigint#)
111 var bb : std.bigint# = (b : std.bigint#)
123 var b : std.bigint# = (z : std.bigint#)
134 var b : std.bigint# = (z : std.bigint#)
146 gcd = {a : Z#, b : Z#
147 var ab : std.bigint# = (a : std.bigint#)
148 var bb : std.bigint# = (b : std.bigint#)
153 elif std.bigiszero(ab)
159 var t1 = std.bigdup(ab)
161 var t2 = std.bigdup(bb)
183 lcm = {a : Z#, b : Z#
184 if std.bigiszero((a : std.bigint#)) && std.bigiszero((b : std.bigint#))
188 var d = yakmo.gcd(a, b)
190 match yakmo.div_maybe(a, d)
191 | `std.None: /* impossible */
193 | `std.Some ab_over_d:
194 yakmo.rmul_ip(ab_over_d, b)
195 yakmo.abs_ip(ab_over_d)
201 impl real_struct Z# =
203 compconj = {z; -> t.dup(z)}
206 impl std.equatable Z# =
207 eq = {a,b; -> std.bigeq((a : std.bigint#),(b : std.bigint#))}
210 impl t.comparable Z# =
211 cmp = {a,b; -> std.bigcmp((a : std.bigint#),(b : std.bigint#))}
216 var aa = std.bigdup((a : std.bigint#))
223 var bz = auto Zfrom(b)
224 var abi : std.bigint# = (a : std.bigint#)
225 var bbi : std.bigint# = (bz : std.bigint#)
226 -> std.bigeq(abi, bbi)
229 -> std.bigeqi((a : std.bigint#), b)
233 impl Zlike @a :: numeric,integral @a =
234 Zfrom = { a; -> (std.mkbigint(a) : Z#) }
238 Zfrom = {a; -> t.dup(a)}
242 generic Zfrom = {a; -> (std.mkbigint(a) : Z#) }
245 match std.bigparse(s)
246 | `std.Some n: -> `std.Ok (n : Z#)
247 | `std.None: -> `std.Err std.fmt("cannot parse \"{}\"", s)