public void BasicDivisible() { string AsString; bool IsDivisible; using mpz_t a = new mpz_t("234052834524092854092874502983745029345723098457209305981001312"); AsString = a.ToString(); Assert.AreEqual("234052834524092854092874502983745029345723098457209305981001312", AsString); using mpz_t b = new mpz_t("7879512"); AsString = b.ToString(); Assert.AreEqual("7879512", AsString); IsDivisible = a.IsDivisible(b); Assert.IsTrue(IsDivisible); using mpz_t c = new mpz_t("234052834524092854092874502983745029345723098457209305981001313"); AsString = c.ToString(); Assert.AreEqual("234052834524092854092874502983745029345723098457209305981001313", AsString); IsDivisible = c.IsDivisible(b); Assert.IsFalse(IsDivisible); }
public void GcdExt() { string AsString; using mpz_t a = new mpz_t("29927402397991286489627837734179186385188296382227"); AsString = a.ToString(); Assert.AreEqual("29927402397991286489627837734179186385188296382227", AsString); using mpz_t b = a * 39; AsString = b.ToString(); Assert.AreEqual("1167168693521660173095485671632988269022343558906853", AsString); using mpz_t c = a * 41; AsString = c.ToString(); Assert.AreEqual("1227023498317642746074741347101346641792720151671307", AsString); using mpz_t d = new(); using mpz_t s = new(); using mpz_t t = new(); mpz.gcdext(d, s, t, b, c); AsString = d.ToString(); Assert.AreEqual("29927402397991286489627837734179186385188296382227", AsString); AsString = s.ToString(); Assert.AreEqual("20", AsString); AsString = t.ToString(); Assert.AreEqual("-19", AsString); using mpz_t g = (b * s) + (c * t); AsString = g.ToString(); Assert.AreEqual("29927402397991286489627837734179186385188296382227", AsString); }
public void SubCanonic() { string AsString; using mpq_t a = new mpq_t("222509832503450298345029835740293845720/115756986668303657898962467957"); AsString = a.ToString(); Assert.AreEqual("222509832503450298345029835740293845720/115756986668303657898962467957", AsString); using mpq_t b = new mpq_t("222987435987982730594288574029879874539/590872612825179551336102196593"); AsString = b.ToString(); Assert.AreEqual("222987435987982730594288574029879874539/590872612825179551336102196593", AsString); using mpq_t c = new(); mpq.sub(c, a, b); AsString = c.ToString(); Assert.AreEqual("105662612455746608298450986036810175085932336578065613346946483985137/68397633165470058274884361378645822467587248043012077070501", AsString); AsString = c.GetNumerator().ToString(); Assert.AreEqual("105662612455746608298450986036810175085932336578065613346946483985137", AsString); AsString = c.GetDenominator().ToString(); Assert.AreEqual("68397633165470058274884361378645822467587248043012077070501", AsString); using mpz_t Numerator = a.GetNumerator() * b.GetDenominator() - b.GetNumerator() * a.GetDenominator(); AsString = Numerator.ToString(); Assert.AreEqual("105662612455746608298450986036810175085932336578065613346946483985137", AsString); using mpz_t Denominator = a.GetDenominator() * b.GetDenominator(); AsString = Denominator.ToString(); Assert.AreEqual("68397633165470058274884361378645822467587248043012077070501", AsString); }
public void DivCanonic() { string AsString; using mpq_t a = new mpq_t("222509832503450298345029835740293845720/115756986668303657898962467957"); AsString = a.ToString(); Assert.AreEqual("222509832503450298345029835740293845720/115756986668303657898962467957", AsString); using mpq_t b = new mpq_t("590872612825179551336102196593/222987435987982730594288574029879874539"); AsString = b.ToString(); Assert.AreEqual("590872612825179551336102196593/222987435987982730594288574029879874539", AsString); using mpq_t c = new(); mpq.div(c, a, b); AsString = c.ToString(); Assert.AreEqual("49616897032059882578779559314539403611774953165369490340046561577107422123080/68397633165470058274884361378645822467587248043012077070501", AsString); AsString = c.GetNumerator().ToString(); Assert.AreEqual("49616897032059882578779559314539403611774953165369490340046561577107422123080", AsString); AsString = c.GetDenominator().ToString(); Assert.AreEqual("68397633165470058274884361378645822467587248043012077070501", AsString); using mpz_t Numerator = a.GetNumerator() * b.GetDenominator(); AsString = Numerator.ToString(); Assert.AreEqual("49616897032059882578779559314539403611774953165369490340046561577107422123080", AsString); using mpz_t Denominator = a.GetDenominator() * b.GetNumerator(); AsString = Denominator.ToString(); Assert.AreEqual("68397633165470058274884361378645822467587248043012077070501", AsString); }
public void AddCanonic() { string AsString; using mpq_t a = new mpq_t("222509832503450298345029835740293845720/115756986668303657898962467957"); AsString = a.ToString(); Assert.AreEqual("222509832503450298345029835740293845720/115756986668303657898962467957", AsString); using mpq_t b = new mpq_t("222987435987982730594288574029879874539/590872612825179551336102196593"); AsString = b.ToString(); Assert.AreEqual("222987435987982730594288574029879874539/590872612825179551336102196593", AsString); using mpq_t c = new(); mpq.add(c, a, b); AsString = c.ToString(); Assert.AreEqual("157287319765466872798299859701022414376160801933389609744596419278783/68397633165470058274884361378645822467587248043012077070501", AsString); AsString = c.GetNumerator().ToString(); Assert.AreEqual("157287319765466872798299859701022414376160801933389609744596419278783", AsString); AsString = c.GetDenominator().ToString(); Assert.AreEqual("68397633165470058274884361378645822467587248043012077070501", AsString); using mpz_t Numerator = a.GetNumerator() * b.GetDenominator() + b.GetNumerator() * a.GetDenominator(); AsString = Numerator.ToString(); Assert.AreEqual("157287319765466872798299859701022414376160801933389609744596419278783", AsString); using mpz_t Denominator = a.GetDenominator() * b.GetDenominator(); AsString = Denominator.ToString(); Assert.AreEqual("68397633165470058274884361378645822467587248043012077070501", AsString); }
public void FitInt() { string AsString; bool IsFitting; using mpz_t a = new mpz_t("7FFFFFFF", 16); AsString = a.ToString(16).ToUpper(); Assert.AreEqual("7FFFFFFF", AsString); IsFitting = mpz.fits_sint_p(a); Assert.IsTrue(IsFitting); using mpz_t b = a + 1; IsFitting = mpz.fits_sint_p(b); Assert.IsFalse(IsFitting); using mpz_t c = -b; IsFitting = mpz.fits_sint_p(c); Assert.IsTrue(IsFitting); using mpz_t d = c - 1; IsFitting = mpz.fits_sint_p(d); Assert.IsFalse(IsFitting); }
public void Scan0() { string AsString; ulong Scan; using mpz_t a = new mpz_t("A0000000000000000000800000000001", 16); AsString = a.ToString(16).ToUpper(); Assert.AreEqual("A0000000000000000000800000000001", AsString); Scan = mpz.scan0(a, 0); Assert.AreEqual(Scan, 1UL); Scan = mpz.scan0(a, 1UL); Assert.AreEqual(Scan, 1UL); Scan = mpz.scan0(a, 9UL); Assert.AreEqual(Scan, 9UL); Scan = mpz.scan0(a, 127UL); Assert.AreEqual(Scan, 128UL); Scan = mpz.scan1(a, 0); Assert.AreEqual(Scan, 0UL); Scan = mpz.scan1(a, 1UL); Assert.AreEqual(Scan, 47UL); Scan = mpz.scan1(a, 47UL); Assert.AreEqual(Scan, 47UL); Scan = mpz.scan1(a, 48UL); Assert.AreEqual(Scan, 125UL); }
public void PowerOfTwo() { string AsString; bool IsCongruent; using mpz_t a = new mpz_t("234052834524092854092874502983745029345723098457209305981001312"); AsString = a.ToString(); Assert.AreEqual("234052834524092854092874502983745029345723098457209305981001312", AsString); using mpz_t b = new mpz_t("2340528345240928540928745029837450293451169376"); AsString = b.ToString(); Assert.AreEqual("2340528345240928540928745029837450293451169376", AsString); int c = 25; uint p = 1U << c; using mpz_t x = a / p; using mpz_t y = b / p; using mpz_t x1 = x * p; using mpz_t y1 = y * p; using mpz_t x2 = a - x1; using mpz_t y2 = y1 + x2; IsCongruent = a.IsCongruentPowerOfTwo(b, c); Assert.IsTrue(IsCongruent); using mpz_t d = new mpz_t("2340528345240928540928745029837450293454373193"); AsString = d.ToString(); Assert.AreEqual("2340528345240928540928745029837450293454373193", AsString); IsCongruent = d.IsCongruentPowerOfTwo(b, c); Assert.IsFalse(IsCongruent); }
public void GreaterThan() { string AsString; bool IsGreaterThan; using mpz_t a = new mpz_t("622288097498926496141095869268883999563096063592498055290461"); AsString = a.ToString(); Assert.AreEqual("622288097498926496141095869268883999563096063592498055290461", AsString); using mpz_t b = new mpz_t("622288097498926496141095869268883999563096063592498055290460"); AsString = b.ToString(); Assert.AreEqual("622288097498926496141095869268883999563096063592498055290460", AsString); IsGreaterThan = a > b; Assert.IsTrue(IsGreaterThan); double d = 50.0; IsGreaterThan = a > d; Assert.IsTrue(IsGreaterThan); int n = 50; IsGreaterThan = a > n; Assert.IsTrue(IsGreaterThan); uint p = 50U; IsGreaterThan = a > p; Assert.IsTrue(IsGreaterThan); }
public void Realloc2() { string AsString; using mpz_t a = new mpz_t("222509832503450298345029835740293845720"); mpz.realloc2(a, 2000); AsString = a.ToString(); Assert.AreEqual("222509832503450298345029835740293845720", AsString); mpz.realloc2(a, 20); AsString = a.ToString(); Assert.AreEqual("0", AsString); }
public void CompareAbs() { string AsString; bool IsGreaterThan; using mpz_t a = new mpz_t("-622288097498926496141095869268883999563096063592498055290461"); AsString = a.ToString(); Assert.AreEqual("-622288097498926496141095869268883999563096063592498055290461", AsString); using mpz_t b = new mpz_t("622288097498926496141095869268883999563096063592498055290460"); AsString = b.ToString(); Assert.AreEqual("622288097498926496141095869268883999563096063592498055290460", AsString); IsGreaterThan = mpz.cmpabs(a, b) > 0; Assert.IsTrue(IsGreaterThan); double d = 50.0; IsGreaterThan = mpz.cmpabs_d(a, d) > 0; Assert.IsTrue(IsGreaterThan); uint p = 50U; IsGreaterThan = mpz.cmpabs_ui(a, p) > 0; Assert.IsTrue(IsGreaterThan); }
public void TowardZero() { string AsString; using mpz_t a = new mpz_t("234052834524092854092874502983745029345723098457209305983434345"); AsString = a.ToString(); Assert.AreEqual("234052834524092854092874502983745029345723098457209305983434345", AsString); using mpz_t b = new mpz_t("394580293847502987609283945873594873409587"); AsString = b.ToString(); Assert.AreEqual("394580293847502987609283945873594873409587", AsString); mpz_t.Divide(a, b, out mpz_t q, out mpz_t r); AsString = q.ToString(); Assert.AreEqual("593169091750307653294", AsString); AsString = r.ToString(); Assert.AreEqual("114368714235760586972822754176083531704767", AsString); mpz_t.Divide(a, b, out q, out r, Rounding.TowardZero); AsString = q.ToString(); Assert.AreEqual("593169091750307653294", AsString); AsString = r.ToString(); Assert.AreEqual("114368714235760586972822754176083531704767", AsString); using mpz_t n = r + (q * b); AsString = n.ToString(); Assert.AreEqual("234052834524092854092874502983745029345723098457209305983434345", AsString); }
public void UintTowardZero() { string AsString; using mpz_t a = new mpz_t("234052834524092854092874502983745029345723098457209305983434345"); AsString = a.ToString(); Assert.AreEqual("234052834524092854092874502983745029345723098457209305983434345", AsString); uint b = 17835; mpz_t.Divide(a, b, out mpz_t q, out mpz_t r); AsString = q.ToString(); Assert.AreEqual("13123231540459369447315643565110458612039422397376467955336", AsString); AsString = r.ToString(); Assert.AreEqual("16785", AsString); mpz_t.Divide(a, b, out q, out r, Rounding.TowardZero); AsString = q.ToString(); Assert.AreEqual("13123231540459369447315643565110458612039422397376467955336", AsString); AsString = r.ToString(); Assert.AreEqual("16785", AsString); using mpz_t n = r + (q * b); AsString = n.ToString(); Assert.AreEqual("234052834524092854092874502983745029345723098457209305983434345", AsString); }
static bool IsPrimeProof(mpz_t n) { var ns = n.ToString(); var digits = ns.ToCharArray(); char[] digitsCopy = new char[digits.Length]; for (int di = 0; di < digits.Length; di++) { int digit = digits[di]; var low = di == 0 ? '1' : '0'; for (char odigit = low; odigit <= '9'; odigit++) { if (odigit != digit) { Array.Copy(digits, digitsCopy, digits.Length); digitsCopy[di] = odigit; var cand = new mpz_t(new string(digitsCopy)); if (cand.IsProbablyPrimeRabinMiller(10)) { return(false); } } } } return(true); }
public void BasicCongruent() { string AsString; bool IsCongruent; using mpz_t a = new mpz_t("234052834524092854092874502983745029345723098457209305981001312"); AsString = a.ToString(); Assert.AreEqual("234052834524092854092874502983745029345723098457209305981001312", AsString); using mpz_t b = new mpz_t("2340528345240928540928745029837450293454373192"); AsString = b.ToString(); Assert.AreEqual("2340528345240928540928745029837450293454373192", AsString); using mpz_t c = new mpz_t("7879512"); AsString = c.ToString(); Assert.AreEqual("7879512", AsString); IsCongruent = a.IsCongruent(b, c); Assert.IsTrue(IsCongruent); using mpz_t d = new mpz_t("2340528345240928540928745029837450293454373193"); AsString = d.ToString(); Assert.AreEqual("2340528345240928540928745029837450293454373193", AsString); IsCongruent = d.IsCongruent(b, c); Assert.IsFalse(IsCongruent); }
public void NonUniformExp() { using randstate_t state = new(); using mpz_t a = new mpz_t(); ulong n = 60; mpz.rrandomb(a, state, n); string AsString0 = a.ToString(); mpz.rrandomb(a, state, n); string AsString1 = a.ToString(); Assert.AreNotEqual(AsString0, AsString1); }
public void SetBit() { string AsString; using mpz_t a = new mpz_t("A0000000000000000000200000000001", 16); AsString = a.ToString(16).ToUpper(); Assert.AreEqual("A0000000000000000000200000000001", AsString); a.SetBit(47); AsString = a.ToString(16).ToUpper(); Assert.AreEqual("A0000000000000000000A00000000001", AsString); a.SetBit(47); AsString = a.ToString(16).ToUpper(); Assert.AreEqual("A0000000000000000000A00000000001", AsString); a.ClearBit(45); AsString = a.ToString(16).ToUpper(); Assert.AreEqual("A0000000000000000000800000000001", AsString); a.ClearBit(45); AsString = a.ToString(16).ToUpper(); Assert.AreEqual("A0000000000000000000800000000001", AsString); a.ClearBit(131); AsString = a.ToString(16).ToUpper(); Assert.AreEqual("A0000000000000000000800000000001", AsString); a.SetBit(131); AsString = a.ToString(16).ToUpper(); Assert.AreEqual("8A0000000000000000000800000000001", AsString); }
public void SubProductUint() { string AsString; using mpz_t a = new mpz_t("98750293847520938457029384572093480498357"); AsString = a.ToString(); Assert.AreEqual("98750293847520938457029384572093480498357", AsString); using mpz_t b = new mpz_t("23094582093845093574093845093485039450934"); AsString = b.ToString(); Assert.AreEqual("23094582093845093574093845093485039450934", AsString); uint Two = 2; mpz.submul_ui(a, b, Two); AsString = a.ToString(); Assert.AreEqual("52561129659830751308841694385123401596489", AsString); }
public void AddProductUint() { string AsString; using mpz_t a = new mpz_t("98750293847520938457029384572093480498357"); AsString = a.ToString(); Assert.AreEqual("98750293847520938457029384572093480498357", AsString); using mpz_t b = new mpz_t("23094582093845093574093845093485039450934"); AsString = b.ToString(); Assert.AreEqual("23094582093845093574093845093485039450934", AsString); uint Two = 2; mpz.addmul_ui(a, b, Two); AsString = a.ToString(); Assert.AreEqual("144939458035211125605217074759063559400225", AsString); }
public void IncrementOperator() { string AsString; mpz_t a = new mpz_t("222509832503450298345029835740293845720"); AsString = a.ToString(); Assert.AreEqual("222509832503450298345029835740293845720", AsString); a++; AsString = a.ToString(); Assert.AreEqual("222509832503450298345029835740293845721", AsString); using (mpz_t clear = a) { } }
public void Init2() { using mpz_t a = new mpz_t("222509832503450298345029835740293845720"); mpz.init2(a, 20); string AsString = a.ToString(); Assert.AreEqual("0", AsString); }
public void Out() { string AsString; using mpz_t a = new mpz_t("622288097498926496141095869268883999563096063592498055290461"); AsString = a.ToString(); Assert.AreEqual("622288097498926496141095869268883999563096063592498055290461", AsString); using (MemoryStream Stream = new MemoryStream()) { using (StreamWriter Writer = new StreamWriter(Stream, default, -1, leaveOpen: true))
static void Bar() { // [using-sample] using (mpz_t a = new mpz_t(12345678901234567890)) using (mpz_t b = new mpz_t(9876543210987654321)) using (mpz_t c = a * b) { System.Console.WriteLine("{0}", c.ToString()); } // [/using-sample] }
public void BasicSubtractProduct() { string AsString; using mpz_t a = new mpz_t("98750293847520938457029384572093480498357"); AsString = a.ToString(); Assert.AreEqual("98750293847520938457029384572093480498357", AsString); using mpz_t b = new mpz_t("23094582093845093574093845093485039450934"); AsString = b.ToString(); Assert.AreEqual("23094582093845093574093845093485039450934", AsString); using mpz_t c = new mpz_t("394580293847502987609283945873594873409587"); AsString = c.ToString(); Assert.AreEqual("394580293847502987609283945873594873409587", AsString); mpz.submul(a, b, c); AsString = a.ToString(); Assert.AreEqual("-9112666988874677841199955832262586145147830205230375090322356322089362221491205901", AsString); }
public void Sign() { string AsString; bool IsNegative; using mpz_t a = new mpz_t("-622288097498926496141095869268883999563096063592498055290461"); AsString = a.ToString(); Assert.AreEqual("-622288097498926496141095869268883999563096063592498055290461", AsString); IsNegative = mpz.sgn(a) < 0; Assert.IsTrue(IsNegative); }
public void PopCount() { string AsString; using mpz_t a = new mpz_t("10123456789ABCDEF0123456789ABCDEF0123456789ABCDEF", 16); AsString = a.ToString(16).ToUpper(); Assert.AreEqual("10123456789ABCDEF0123456789ABCDEF0123456789ABCDEF", AsString); ulong Count = mpz.popcount(a); Assert.AreEqual(Count, 97UL); }
public void PerfectSquare() { string AsString; using mpz_t a = new mpz_t("95754294066634670780206802290671646680930214410991689632113801"); AsString = a.ToString(); Assert.AreEqual("95754294066634670780206802290671646680930214410991689632113801", AsString); bool IsPerfectSquare = a.IsPerfectSquare(); Assert.IsTrue(IsPerfectSquare); }
public void PerfectPower() { string AsString; using mpz_t a = new mpz_t("936995247845762439229916837840025004943963737679442023171062337518037547173883302933966320549"); AsString = a.ToString(); Assert.AreEqual("936995247845762439229916837840025004943963737679442023171062337518037547173883302933966320549", AsString); bool IsPerfectPower = a.IsPerfectPower(); Assert.IsTrue(IsPerfectPower); }
public void AddNonCanonicOperator() { string AsString; using mpz_t n0 = new mpz_t("222509832503450298345029835740293845720"); using mpz_t d0 = new mpz_t("115756986668303657898962467957"); using mpq_t a = new mpq_t(n0, d0); AsString = a.ToString(); Assert.AreEqual("222509832503450298345029835740293845720/115756986668303657898962467957", AsString); using mpz_t n1 = new mpz_t("222987435987982730594288574029879874539"); using mpz_t d1 = new mpz_t("590872612825179551336102196593"); using mpq_t b = new mpq_t(n1, d1); AsString = b.ToString(); Assert.AreEqual("222987435987982730594288574029879874539/590872612825179551336102196593", AsString); using mpz_t n2 = n0 * 2; using mpz_t d2 = d0 * 17; using mpq_t c = new mpq_t(n2, d2); AsString = c.ToString(); Assert.AreEqual("445019665006900596690059671480587691440/1967868773361162184282361955269", AsString); c.Canonicalize(); AsString = c.ToString(); Assert.AreEqual("445019665006900596690059671480587691440/1967868773361162184282361955269", AsString); using mpz_t n3 = n1 * 2; using mpz_t d3 = d1 * 17; using mpq_t d = new mpq_t(n3, d3); AsString = d.ToString(); Assert.AreEqual("445974871975965461188577148059759749078/10044834418028052372713737342081", AsString); d.Canonicalize(); AsString = d.ToString(); Assert.AreEqual("445974871975965461188577148059759749078/10044834418028052372713737342081", AsString); using mpq_t e = c + d; AsString = e.ToString(); Assert.AreEqual("314574639530933745596599719402044828752321603866779219489192838557566/1162759763812990990673034143436978981948983216731205310198517", AsString); using mpz_t Numerator = c.GetNumerator() * d.GetDenominator() + d.GetNumerator() * c.GetDenominator(); AsString = Numerator.ToString(); Assert.AreNotEqual("314574639530933745596599719402044828752321603866779219489192838557566", AsString); }
public void DivNonCanonicOperator() { string AsString; using mpz_t n0 = new mpz_t("222509832503450298345029835740293845720"); using mpz_t d0 = new mpz_t("115756986668303657898962467957"); using mpq_t a = new mpq_t(n0, d0); AsString = a.ToString(); Assert.AreEqual("222509832503450298345029835740293845720/115756986668303657898962467957", AsString); using mpz_t n1 = new mpz_t("590872612825179551336102196593"); using mpz_t d1 = new mpz_t("222987435987982730594288574029879874539"); using mpq_t b = new mpq_t(n1, d1); AsString = b.ToString(); Assert.AreEqual("590872612825179551336102196593/222987435987982730594288574029879874539", AsString); using mpz_t n2 = n0 * 2; using mpz_t d2 = d0 * 17; using mpq_t c = new mpq_t(n2, d2); AsString = c.ToString(); Assert.AreEqual("445019665006900596690059671480587691440/1967868773361162184282361955269", AsString); c.Canonicalize(); AsString = c.ToString(); Assert.AreEqual("445019665006900596690059671480587691440/1967868773361162184282361955269", AsString); using mpz_t n3 = n1 * 2; using mpz_t d3 = d1 * 17; using mpq_t d = new mpq_t(n3, d3); AsString = d.ToString(); Assert.AreEqual("1181745225650359102672204393186/3790786411795706420102905758507957867163", AsString); d.Canonicalize(); AsString = d.ToString(); Assert.AreEqual("1181745225650359102672204393186/3790786411795706420102905758507957867163", AsString); using mpq_t e = c / d; AsString = e.ToString(); Assert.AreEqual("49616897032059882578779559314539403611774953165369490340046561577107422123080/68397633165470058274884361378645822467587248043012077070501", AsString); using mpz_t Numerator = c.GetNumerator() * d.GetDenominator(); AsString = Numerator.ToString(); Assert.AreNotEqual("49616897032059882578779559314539403611774953165369490340046561577107422123080", AsString); }