BeginPackage["Gaussian`"] (* Copyright: Erich Kaltofen, 4/27/1990. Permission to use provided the copyright notice is not removed. *) Gaussian`Quotient::usage = "Quotient[a_, b_] computes a Gaussian integral quotient of two Gaussian integers. " Gaussian`Remainder::usage = "Remainder[a_, b_] computes a Gaussian integral remainder of two Gaussian integers. " Gaussian`Normalize::usage = "Normalize[a_] returns b such that b/a = 1, -1, I, or -I and -Pi/4 < Arg[b] <= Pi/4" Begin["`private`"] Quotient[a_, b_]:= (* Gaussian integer division *) Block[{ratq, rp, ip}, ratq = a/b; rp = Floor[ Re[ratq] + 1/2 ]; ip = Floor[ Im[ratq] + 1/2 ]; Return[rp + I ip] ] Remainder[a_, b_]:= (* Gaussian integer remainder *) a - Gaussian`Quotient[a, b] * b; Normalize[a_]:= (* normalize a such that -Pi/4 < Arg <= Pi/4 *) Block[{rp = Re[a], ip = Im[a]}, Which[rp < 0 && ip == rp, -a, rp < 0 && Abs[ip] < Abs[rp], -a, ip > 0 && rp == -ip, - a * I, ip > 0 && Abs[rp] < Abs[ip], - a * I, ip < 0 && rp == ip, a * I, ip < 0 && Abs[rp] < Abs[ip], a * I, True, a] ] End[] EndPackage[] Null