Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }
Example #9
0
        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);
        }
Example #10
0
        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);
        }
Example #11
0
        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);
        }
Example #12
0
        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);
        }
Example #13
0
        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);
        }
Example #14
0
        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);
        }
Example #15
0
        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);
        }
Example #16
0
        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);
        }
Example #17
0
        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);
        }
Example #18
0
        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);
        }
Example #19
0
        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);
        }
Example #20
0
        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)
            {
            }
        }
Example #21
0
        public void Init2()
        {
            using mpz_t a = new mpz_t("222509832503450298345029835740293845720");

            mpz.init2(a, 20);

            string AsString = a.ToString();

            Assert.AreEqual("0", AsString);
        }
Example #22
0
        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))
Example #23
0
 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]
 }
Example #24
0
        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);
        }
Example #25
0
        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);
        }
Example #26
0
        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);
        }
Example #27
0
        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);
        }
Example #28
0
        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);
        }
Example #29
0
        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);
        }
Example #30
0
        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);
        }