public void RationalCompareToHugeInt() { using (var a = new HugeRational("-222509832503450298345029835740293845721/115756986668303657898962467957")) using (var b = new HugeInt("115756986668303657898962467957")) using (var c = new HugeRational("115756986668303657898962467957/1")) using (var d = new HugeInt(1922215141)) { Assert.AreEqual(-1, System.Math.Sign(a.CompareTo(d))); Assert.AreEqual(1, System.Math.Sign((-a).CompareTo(d))); Assert.AreEqual(-1, System.Math.Sign((-a).CompareTo(d + 1))); Assert.AreEqual(1, System.Math.Sign(d.CompareTo(a))); Assert.AreEqual(-1, System.Math.Sign(d.CompareTo(-a))); Assert.AreEqual(1, System.Math.Sign((d + 1).CompareTo(-a))); Assert.AreEqual(0, System.Math.Sign(b.CompareTo(c))); Assert.AreEqual(0, System.Math.Sign(c.CompareTo(b))); Assert.AreEqual(0, System.Math.Sign((-b).CompareTo(-c))); Assert.AreEqual(0, System.Math.Sign((-c).CompareTo(-b))); Assert.AreEqual(1, System.Math.Sign(b.CompareTo(c - 1))); Assert.AreEqual(1, System.Math.Sign(c.CompareTo(b - 1))); Assert.AreEqual(-1, System.Math.Sign((-b).CompareTo(1 - c))); Assert.AreEqual(-1, System.Math.Sign((-c).CompareTo(1 - b))); } }
public void RationalSwap() { var strA = "-222509832503450298345029835740293845720/115756986668303657898962467957"; var strB = "2039847290878794872059384789347534534/590872612825179551336102196593"; using (var a = new HugeRational(strA)) using (var b = new HugeRational(strB)) { var aValue = a._value(); var bValue = b._value(); var an = a.Numerator; var ad = a.Denominator; var bn = b.Numerator; var bd = b.Denominator; a.Swap(b); Assert.AreEqual(aValue, a._value()); Assert.AreEqual(bValue, b._value()); Assert.AreEqual(strB, a.ToString()); Assert.AreEqual(strA, b.ToString()); Assert.AreEqual(strB, string.Format("{0}/{1}", an, ad)); Assert.AreEqual(strA, string.Format("{0}/{1}", bn, bd)); } }
public void RationalEqualsNonExpression() { using (var a = new HugeRational("-222509832503450298345029835740293845721/115756986668303657898962467957")) { Assert.IsFalse(a.Equals("abc")); } }
public void RationalFromInvalidString2() { using (var a = new HugeRational()) { a.SetTo("12345/13345A"); } }
public void RationalCompareToNonExpression() { using (var a = new HugeRational("-222509832503450298345029835740293845721/115756986668303657898962467957")) { a.CompareTo("abc"); } }
public void RationalConstructorFromDoubleNegative() { using (var a = new HugeRational(-123456789123456.75)) { Assert.AreEqual("-493827156493827/4", a.ToString()); } }
public void RationalConstructorFromIntExpression() { using (var a = new HugeInt("2340958273409578234095823045723490587")) using (var b = new HugeRational(a + 1)) { Assert.AreEqual("2340958273409578234095823045723490588/1", b.ToString()); } }
public void RationalConstructorFromFloatExpression() { using (var a = new HugeFloat("2340958273409578234.25")) using (var b = new HugeRational(a + 1)) { Assert.AreEqual("9363833093638312941/4", b.ToString()); } }
public void RationalConstructorFromExpression() { using (var a = new HugeRational("2340958273409578234095823045723490587/362736035870515331128527330659")) using (var b = new HugeRational(a + 1)) { Assert.AreEqual(a + 1, b); } }
public void RationalAssignFloat() { using (var a = new HugeFloat("9363833093638312937.25")) using (var b = new HugeRational()) { b.SetTo(a); Assert.AreEqual("37455332374553251749/4", b.ToString()); } }
public void RationalAssignCopy() { using (var a = new HugeRational("-222509832503450298345029835740293845720/115756986668303657898962467957")) using (var b = new HugeRational()) { b.Value = a; Assert.AreEqual("-222509832503450298345029835740293845720/115756986668303657898962467957", b.ToString()); } }
public void FloatAssignRational() { using (var a = new HugeRational(1, 3)) using (var b = new HugeFloat()) { b.SetTo(a); FloatAssert.AreEqual(".33333333333333333333333333333333333333333333333333333333333333333333333333333333333", b); } }
public void IntAssignRational() { using (var a = new HugeRational("222509832503450298345029835740293845720/7")) using (var b = new HugeInt()) { b.SetTo(a); Assert.AreEqual("31787118929064328335004262248613406531", b.ToString()); } }
public void RationalAssignFloat2() { using(var a = new HugeFloat("222509832503450298342455029.125")) using(var b = new HugeRational("1/3")) { b.SetTo(a); Assert.AreEqual("1780078660027602386739640233/8", b.ToString()); } }
public void RationalAssignInt() { using (var a = new HugeInt("222509832503450298345029835740293845720")) using (var b = new HugeRational("1/3")) { b.SetTo(a); Assert.AreEqual("222509832503450298345029835740293845720/1", b.ToString()); } }
public void RationalDenominator() { using (var a = new HugeRational()) { a.Denominator.Dispose(); Assert.AreNotEqual(0, a.Denominator.NumberOfLimbsAllocated()); Assert.AreEqual("1", a.Denominator.ToString()); } }
public void RationalAssignFloat2() { using (var a = new HugeFloat("222509832503450298342455029.125")) using (var b = new HugeRational("1/3")) { b.SetTo(a); Assert.AreEqual("1780078660027602386739640233/8", b.ToString()); } }
public void RationalCompoundOperators() { using (var a = new HugeRational("938475092834705928347523452345/115756986668303657898962467957")) { a.Value += 1; a.Value *= 10; Assert.AreEqual("10542320795030095862464859203020/115756986668303657898962467957", a.ToString()); } }
public void RationalDivideHugeRational() { using (var a = new HugeRational("115756986668303657898962467957/394580293847502987609283945873594873409587")) using (var b = new HugeRational("593169091750307653294")) { a.Value = a / b; Assert.AreEqual("115756986668303657898962467957/234052834524092854092760134269509268758750275703033222451729578", a.ToString()); } }
public void RationalShiftLeft() { using (var a = new HugeRational("-12345700987ABCDEF2345CBDEFA245230948/17607EF654EB9A13FFA163C75", 16)) { uint b = 40; a.Value = a << b; Assert.AreEqual("-12345700987ABCDEF2345CBDEFA2452309480000000000/17607EF654EB9A13FFA163C75", a.ToString(16)); } }
public void RationalSign() { using (var a = new HugeRational("-222509832503450298345029835740293845721/115756986668303657898962467957")) { Assert.AreEqual(-1, a.Sign()); Assert.AreEqual(1, (-a).Sign()); Assert.AreEqual(0, (a - a).Sign()); } }
public void RationalShiftRight() { using (var a = new HugeRational("ABCDEF052834524092854092874502983745029345723098457209305983434345/17607EF654EB9A13FFA163C75", 16)) { uint b = 96; a.Value = a >> b; Assert.AreEqual("ABCDEF052834524092854092874502983745029345723098457209305983434345/17607EF654EB9A13FFA163C75000000000000000000000000", a.ToString(16)); } }
public void RationalGetHashCodeTest() { using (var a = new HugeRational("-222509832503450298345029835740293845721/115756986668303657898962467957")) { Assert.AreNotEqual(0, a.GetHashCode()); Assert.AreEqual(a.GetHashCode(), (a + 0).GetHashCode()); Assert.AreNotEqual(a.GetHashCode(), (-a).GetHashCode()); } }
public void RationalCanonicalize() { using (var a = new HugeRational(198, 15)) { a.Denominator.Value = -a.Denominator; Assert.AreEqual("198/-15", a.ToString()); a.Canonicalize(); Assert.AreEqual("-66/5", a.ToString()); } }
public void RationalEqualsOperatorLimb() { using (var a = new HugeRational("-835740293845721")) { ulong b = 835740293845720; Assert.IsFalse(b == a); Assert.IsFalse(a == b + 1); Assert.IsTrue(-(a + 1) == b); } }
public void RationalEqualsSignedLimb() { using (var a = new HugeRational(Platform.Select("-222509832505", "-222509835"))) { var b = Platform.Si(-222509832504, -222509834); Assert.IsFalse(a.Equals(b + 1)); Assert.IsTrue(a.Equals(b - 1)); Assert.IsTrue((a + 1).Equals(b)); } }
public void RationalEqualsLimb() { using (var a = new HugeRational(Platform.Select("222509832503", "2225098323"))) { var b = Platform.Ui(222509832504, 2225098324); Assert.IsFalse(a.Equals(b + 1)); Assert.IsTrue(a.Equals(b - 1)); Assert.IsTrue((a + 1).Equals(b)); } }
public void RationalConstructorFromIntExpression2() { using (var a = new HugeInt("2340958273409578234095823045723490587")) using (var d = new HugeInt("362736035870515331128527330659")) using (var b = new HugeRational(a + 2, d * 2)) { Assert.AreEqual(a + 2, b.Numerator); Assert.AreEqual(d * 2, b.Denominator); } }
private void VerifyPartialResult(MpirRandom rnd, RationalExpression expr, long expected) { rnd.Seed(123); using (var r = new HugeRational()) { r.Value = expr; Assert.AreEqual(expected.ToString() + "/1", r.ToString()); } }
public void RationalNotEqualOperatorSignedLimb() { using (var a = new HugeRational("-835740293845721")) { long b = -835740293845720; Assert.IsTrue(b != a); Assert.IsTrue(a != b + 1); Assert.IsFalse(a + 1 != b); } }
public void RationalStringConstructor() { var n = "5432109876543212345789023245987/362736035870515331128527330659"; using (var a = new HugeRational(n)) { Assert.AreEqual(128 / MpirSettings.BITS_PER_LIMB, a.NumeratorNumberOfLimbsUsed()); Assert.AreEqual(n, a.ToString()); } }
public void RationalAddHugeRational() { using (var a = new HugeRational("222509832503450298345029835740293845720/115756986668303657898962467957")) using (var b = new HugeRational("222987435987982730594288574029879874539/590872612825179551336102196593")) using (var c = new HugeRational(a + b)) { Assert.AreEqual(a.Numerator * b.Denominator + b.Numerator * a.Denominator, c.Numerator); Assert.AreEqual(a.Denominator * b.Denominator, c.Denominator); } }
public void RationalStringConstructorNumeratorOnly() { var n = "5432109876543212345789023245987"; using (var a = new HugeRational(n)) { Assert.AreEqual(128 / MpirSettings.BITS_PER_LIMB, a.NumeratorNumberOfLimbsUsed()); Assert.AreEqual(n + "/1", a.ToString()); } }
public void RationalApproximateSizeInBase() { using (var a = new HugeRational("2983475029834750293429834750298347502934298347502983475029342983475029834750293429834750298347502934/115756986668303657898962467957")) { AssertBetween(131, 133, a.ApproximateSizeInBase(10)); AssertBetween(429, 429, a.ApproximateSizeInBase(2)); AssertBetween(109, 109, a.ApproximateSizeInBase(16)); AssertBetween(84, 86, a.ApproximateSizeInBase(36)); AssertBetween(74, 76, a.ApproximateSizeInBase(62)); } }
public void RationalAddLimb() { using (var a = new HugeRational("222509832503450298345029835740293845720/115756986668303657898962467957")) using (var c = new HugeRational()) { var b = Platform.Ui(4288574029879874539UL, 4288574029U); c.Value = a + b; Assert.AreEqual(a.Numerator + b * a.Denominator, c.Numerator); Assert.AreEqual(a.Denominator, c.Denominator); } }
public void RationalCompareToHugeRational() { using (var a = new HugeRational("-222509832503450298345029835740293845721/115756986668303657898962467957")) using (var b = new HugeRational("222509832503450298345029835740293845720/115756986668303657898962467957")) using (var c = new HugeRational("1/115756986668303657898962467957")) { Assert.AreEqual(1, System.Math.Sign(b.CompareTo(a))); Assert.AreEqual(-1, System.Math.Sign(a.CompareTo(b + 1))); Assert.AreEqual(0, System.Math.Sign((a + c).CompareTo(-b))); Assert.AreEqual(1, System.Math.Sign(a.CompareTo(null))); } }
public void RationalCompareToExpression() { using (var a = new HugeRational("-222509832503450298345029835740293845721/115756986668303657898962467957")) using (var b = new HugeRational("222509832503450298345029835740293845720/115756986668303657898962467957")) using (var c = new HugeRational("1/115756986668303657898962467957")) { Assert.AreEqual(1, System.Math.Sign(((IComparable<RationalExpression>)b).CompareTo(a))); Assert.AreEqual(-1, System.Math.Sign(((IComparable<RationalExpression>)a).CompareTo(b))); Assert.AreEqual(1, System.Math.Sign(((IComparable<RationalExpression>)a).CompareTo(null))); Assert.AreEqual(0, System.Math.Sign(((IComparable<RationalExpression>)(a + c)).CompareTo(-b))); } }
public void RationalFromLong() { using (var a = new HugeRational()) { var b = Platform.Si(-0x784739ABCDEF4876, -0xF84776); var d = Platform.Ui(12764787846358441471, 3628273133); a.SetTo(b, d); Assert.AreEqual(b.ToString() + "/" + d.ToString(), a.ToString()); a.SetTo(b); Assert.AreEqual(b.ToString() + "/1", a.ToString()); } }
public void RationalAssignInt2() { using (var a = new HugeInt("222509832503450298345029835740293845719")) using (var d = new HugeInt("115756986668303657898962467957")) using (var b = new HugeRational("1/3")) { b.SetTo(a, d); Assert.AreEqual("222509832503450298345029835740293845719/115756986668303657898962467957", b.ToString()); b.SetTo(b.Numerator - b.Denominator, b.Denominator * 5); Assert.AreEqual(a - d, b.Numerator); Assert.AreEqual(d * 5, b.Denominator); } }
public void RationalAddHugeInt() { using (var a = new HugeRational("222509832503450298345029835740293845720/115756986668303657898962467957")) using (var b = new HugeInt("222987435987982730594288574029879874539")) using (var c = new HugeRational(a + b)) { Assert.AreEqual(a.Numerator + b * a.Denominator, c.Numerator); Assert.AreEqual(a.Denominator, c.Denominator); c.Value = (b + 1) + a; Assert.AreEqual(a.Numerator + (b + 1) * a.Denominator, c.Numerator); Assert.AreEqual(a.Denominator, c.Denominator); } }
public void RationalInputOutputRaw() { using (var a = new HugeRational("0x10123456789ABCDEF0123456789ABCDEF0123456789ABCDEF/361720912810755408215708460645842859722715865206816237944587")) using (var b = new HugeRational()) using (var ms = new MemoryStream()) { a.Value = a ^ 100; a.Write(ms); ms.Position = 0; b.Read(ms); Assert.AreEqual(a, b); Assert.AreEqual(ms.Length, ms.Position); } }
public void IntTestAllExpressions() { var baseExpr = typeof(IntegerExpression); var allExpressions = baseExpr.Assembly.GetTypes() .Where(x => baseExpr.IsAssignableFrom(x) && !x.IsAbstract) .ToList(); var one = Platform.Ui(1, 1); using (var a = new HugeInt(-9L)) using (var b = new HugeInt(4L)) using (var c = new HugeRational(6, 7)) using (var r = MpirRandom.Default()) { var expr = a + (-a * 2) * 3 * (a.Abs() * -2 + -64 + a * a) + (one * 116U) + a; VerifyPartialResult(r, expr, 44); expr = expr + a * 5 + (a+b) * (b + 1) * (b + -3) * b + (b * -a) - (b * (one * 25U)) - a + (b << 3) - ((a*b) << 1); VerifyPartialResult(r, expr, -52); expr = expr - 2 - 3U + (b - (a << 1)) + (b * b - (one * 15U)) * (b - a) * (a - 11) * (b - 3U) - (-340 - a) + ((one * 20U) - b); VerifyPartialResult(r, expr, 52); expr = expr + (-7 - 2 * a) + (28U - 4 * b) + -(a + b * 2) + (3 * a).Abs(); VerifyPartialResult(r, expr, 103); expr = expr / a + expr / (3 * b) - a / b - b / (a + 10) + a % b - (3 * b) % a + a % (2 * b) - (12 * b) % (-5 * a) + (a * 4 / 8).Rounding(RoundingModes.Floor) + (b * 3 % 7).Rounding(RoundingModes.Ceiling); VerifyPartialResult(r, expr, -20); expr = expr - (a * 5).DivideExactly(a) + (b * 7 * 5432198).DivideExactly(5432198) + (b >> 1); VerifyPartialResult(r, expr, 5); expr = expr + (b ^ 3) + a.PowerMod(2, b) + (a + 6).PowerMod(b - 1, b * 5) + (a * a * a).Root(3) + (b * b).SquareRoot(); VerifyPartialResult(r, expr, 78); expr = expr + ((b + 1) & -a) + (b | -a) - (b ^ a) + ~b; VerifyPartialResult(r, expr, 100); expr = expr + r.GetInt(b + 1) + r.GetIntBits(3) + r.GetIntBitsChunky(3) + (b * 2).NextPrimeCandidate(r) - b.Gcd(a - 1); VerifyPartialResult(r, expr, 124); expr = expr - a.Lcm(b * 3) - (b + 1).Lcm(2) - (-a).Invert(b + 7) - (1-a).RemoveFactors(b / 2) - HugeInt.Power(2, 3) - HugeInt.Factorial(4); VerifyPartialResult(r, expr, 36); expr = expr - HugeInt.Primorial(6) + HugeInt.Binomial(4, 2) + HugeInt.Binomial(b, 3) + HugeInt.Fibonacci(6) + HugeInt.Lucas(7); VerifyPartialResult(r, expr, 53); expr = expr + c.Numerator + c.Denominator; VerifyPartialResult(r, expr, 66); MarkExpressionsUsed(allExpressions, expr); } Assert.AreEqual(0, allExpressions.Count, "Expression types not exercised: " + string.Join("", allExpressions.Select(x => Environment.NewLine + x.Name).OrderBy(x => x))); }
public void RationalInputOutputStr() { using (var a = new HugeRational("0x10123456789ABCDEF0123456789ABCDEF0123456789ABCDEF/361720912810755408215708460645842859722715865206816237944587")) using (var b = new HugeRational()) using (var ms = new MemoryStream()) { a.Value = a ^ 100; using (var writer = new StreamWriter(ms, Encoding.UTF8, 1024, true)) a.Write(writer); ms.Position = 0; using (var reader = new StreamReader(ms, Encoding.UTF8, false, 1024, true)) b.Read(reader); Assert.AreEqual(a, b); Assert.AreEqual(ms.Length, ms.Position); } }
public void RationalStringConstructorNumeratorOnly() { var n = "5432109876543212345789023245987"; using(var a = new HugeRational(n)) { Assert.AreEqual(128 / MpirSettings.BITS_PER_LIMB, a.NumeratorNumberOfLimbsUsed()); Assert.AreEqual(n + "/1", a.ToString()); } }
public void RationalStringConstructorInvalid2() { var a = new HugeRational("12345/54321A"); }
public void RationalStringConstructorHexPrefix() { using (var i = new HugeInt("362736035870515331128527330659")) { var d = i.ToString(16); var n = "143210ABCDEF32123457ACDB324598799"; using (var a = new HugeRational("0x" + n + "/0x" + d)) { Assert.AreEqual(n + "/" + d, a.ToString(16)); Assert.AreEqual(i, a.Denominator); } } }
public void RationalStringConstructorHex() { using (var i = new HugeInt("362736035870515331128527330659")) { var d = i.ToString(16); var n = "143210ABCDEF32123457ACDB324598799"; using (var a = new HugeRational(n + "/" + d, 16)) { Assert.AreEqual(n, a.Numerator.ToString(16)); Assert.AreEqual(1 + 128 / MpirSettings.BITS_PER_LIMB, a.NumeratorNumberOfLimbsUsed()); Assert.AreEqual(i, a.Denominator); } } }
public void RationalStringAssignmentHexPrefix() { using (var i = new HugeInt("362736035870515331128527330659")) { var d = i.ToString(16); var n = "143210ABCDEF32123457ACDB324598799"; using (var a = new HugeRational("0x" + n + "/0x" + d)) { Assert.AreEqual(n + "/" + d, a.ToString(16)); Assert.AreEqual(n + "/" + d, a.ToString(16, false)); Assert.AreEqual((n + "/" + d).ToLower(), a.ToString(16, true)); a.SetTo("-0x" + n + "/0x17"); Assert.AreEqual("-" + n + "/17", a.ToString(16)); } } }