15 impl division_struct Qi#
18 impl module_struct Qi# -> Q#
21 impl std.equatable Qi#
24 const Qifrom : (re : Q#, im : Q# -> Qi#)
25 const QifromS : (rep : byte[:], req : byte[:], imp : byte[:], imq : byte[:] -> std.result(Qi#, byte[:]))
32 std.fmtinstall(std.typeof(q), qifmt)
35 const qifmt = {sb, ap, opts
36 var q : Qi# = std.vanext(ap)
39 var rez : bool = std.bigeqi(re.p, 0)
40 var imz : bool = std.bigeqi(im.p, 0)
46 std.sbfmt(sb, "{}", re.p)
47 if !std.bigeqi(re.q, 1)
49 std.sbfmt(sb, "{}", re.q)
58 if !std.bigeqi(im.p, 1)
59 std.sbfmt(sb, "{}", im.p)
62 if !std.bigeqi(im.q, 1)
64 std.sbfmt(sb, "{}", im.q)
71 TODO: Every invocation of this should be replaced with "std.free".
72 Typechecking issues that Ori will fix soon.
74 const freewrap = { a : Qi#
75 std.bytefree((a : byte#), sizeof(Qi))
79 __dispose__ = {q : Qi#
87 impl group_struct Qi# =
91 var ret : Qi = [ .re = qa, .im = qb ]
92 -> (std.mk(ret) : Qi#) // TODO: Cast should be unnecessary
96 -> eq_gid(r.re) && eq_gid(r.im)
99 gadd_ip = {q1 : Qi#, q2 : Qi#
100 gadd_ip(q1.re, q2.re)
101 gadd_ip(q1.im, q2.im)
104 gadd = {q1 : Qi#, q2 : Qi#
122 impl division_struct Qi# =
125 | `std.Some bi: -> `std.Some rmul(a, bi)
126 | `std.None: -> `std.None
131 impl field_struct Qi# =
133 /* TODO: auto should work here. */
134 var a2 : Q# = /* auto */ rmul(q.re, q.re)
135 var b2 : Q# = /* auto */ rmul(q.im, q.im)
136 var m : Q# = /* auto */ gadd(a2, b2)
137 var ret : std.option(Qi#) = `std.None
142 var ap : Q# = rmul(q.re, mi)
143 var bp : Q# = rmul(q.im, mi)
145 var r : Qi = [ .re = ap, .im = bp ]
146 ret = `std.Some (std.mk(r) : Qi#) // TODO: Cast shouldn't be necessary
158 impl module_struct Qi# -> Q# =
159 phi_ip = {r : Q#, q : Qi#
160 /* r · (a, b) := (r·a, r·b) */
165 phi = {r : Q#, q : Qi#
172 impl real_struct Qi# =
184 impl ring_struct Qi# =
186 /* (1, 0) \cong 1 + 0i */
189 var ret : Qi = [ .re = qa, .im = qb ]
190 -> (std.mk(ret) : Qi#) // TODO: Cast should be unnecessary
193 rmul_ip = {q1 : Qi#, q2 : Qi#
194 /* (a, b) · (a', b') := (a·a' - b·b', a·b' + a'·b) */
196 /* Beats me why the auto stuff doesn't work here */
197 var aap : Q# = /* auto */ rmul(q1.re, q2.re)
198 var bbp : Q# = /* auto */ rmul(q1.im, q2.im)
199 var mbbp : Q# = /* auto */ gneg(bbp)
200 var abp : Q# = /* auto */ rmul(q1.re, q2.im)
201 var apb : Q# = /* auto */ rmul(q2.re, q1.im)
202 var oldre : Q# = /* auto */ q1.re
203 var oldim : Q# = /* auto */ q1.im
204 q1.re = gadd(aap, mbbp)
205 q1.im = gadd(abp, apb)
215 rmul = {q1 : Qi#, q2 : Qi#
216 var qq : Qi# = t.dup(q1)
222 impl std.equatable Qi# =
223 eq = {a : Qi#, b : Qi#
224 -> std.eq(a.re, b.re) && std.eq(a.im, b.im)
230 var rep : Q# = t.dup(q.re)
231 var imp : Q# = t.dup(q.im)
232 var ret : Qi = [ .re = rep, .im = imp ]
233 -> (std.mk(ret) : Qi#) // TODO: Cast shouldn't be necessary
237 const Qifrom = {re, im
238 var rep : Q# = t.dup(re)
239 var imp : Q# = t.dup(im)
240 var q : Qi = [ .re = rep, .im = imp ]
241 -> (std.mk(q) : Qi#) // TODO: Cast should be unnecessary */
244 const QifromS = {rep, req, imp, imq
245 match QfromS(rep, req)
247 auto (e : t.doomed_str)
248 -> `std.Err std.fmt("Bad real part: {}", e)
250 match QfromS(imp, imq)
252 auto (e : t.doomed_str)
253 -> `std.Err std.fmt("Bad imaginary part: {}", e)
255 var qbase : Qi = [ .re = re, .im = im ]
256 -> `std.Ok std.mk(qbase)
262 var i : Qi = [ .re = gid(), .im = rid() ]
263 -> (std.mk(i) : Qi#) // TODO: Cast should be unnecessary */