From dd74bc93a4d167a0bc9e3b8a32b7c3789de86955 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sun, 25 Mar 2018 19:53:26 -0400 Subject: Add additional Integer class tests --- validat0.cpp | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 77 insertions(+), 6 deletions(-) (limited to 'validat0.cpp') diff --git a/validat0.cpp b/validat0.cpp index 068d9816..654dd7be 100644 --- a/validat0.cpp +++ b/validat0.cpp @@ -3157,7 +3157,7 @@ bool TestIntegerOps() { try { Integer x = 0; - Integer y = 1; + Integer y = 0; Integer z = a_times_b_mod_c(y, y, x); result = false; } @@ -3174,7 +3174,7 @@ bool TestIntegerOps() { try { Integer x = 0; - Integer y = 1; + Integer y = 0; Integer z = (y * y) % x; result = false; } @@ -3191,7 +3191,7 @@ bool TestIntegerOps() { try { Integer x = 0; - Integer y = 1; + Integer y = 0; Integer z = a_exp_b_mod_c(y, y, x); result = false; } @@ -3208,7 +3208,7 @@ bool TestIntegerOps() { try { Integer x = 0; - Integer y = 1; + Integer y = 0; Integer z = EuclideanDomainOf().Exponentiate(y, y) % x; result = false; } @@ -3221,13 +3221,45 @@ bool TestIntegerOps() std::cout << "FAILED: Integer DivideByZero\n"; } + // Integer divide by 0 + { + try { + Integer r=1, q=1, a=1, d=0; + Integer::Divide(r, q, a, d); + result = false; + } + catch(const Integer::DivideByZero&) { + result = true; + } + + pass = result && pass; + if (!result) + std::cout << "FAILED: Integer DivideByZero\n"; + } + + // Another Integer divide by 0 + { + try { + Integer q=1, a=1; word r=1, d=0; + Integer::Divide(r, q, a, d); + result = false; + } + catch(const Integer::DivideByZero&) { + result = true; + } + + pass = result && pass; + if (!result) + std::cout << "FAILED: Integer DivideByZero\n"; + } + if (pass) std::cout << "passed:"; else std::cout << "FAILED:"; std::cout << " Integer DivideByZero\n"; - // ****************************** RandomNumberNotFound ****************************** + // ************************ RandomNumberNotFound ************************ try { // A run of 71 composites; see http://en.wikipedia.org/wiki/Prime_gap @@ -3243,7 +3275,7 @@ bool TestIntegerOps() std::cout << "FAILED:"; std::cout << " Integer RandomNumberNotFound\n"; - // ****************************** Carmichael pseudo-primes ****************************** + // ************************ Carmichael pseudo-primes ************************ pass=true; if (IsPrime(Integer("561"))) @@ -3469,6 +3501,45 @@ bool TestIntegerOps() std::cout << "FAILED:"; std::cout << " InverseMod operations\n"; + // ****************************** Integer Divide ****************************** + + // Divide (Integer &r, Integer &q, const Integer &a, const Integer &d) + for (unsigned int i=0; i<128; ++i) + { + Integer r, q, a(prng, 1024), d(prng, 1024); + Integer::Divide(r, q, a, d); + + Integer xr = a % d; + Integer xq = a / d; + result = (r == xr) && (q == xq); + + pass = result && pass; + if (!result) + std::cout << "FAILED: Divide operation\n"; + } + + // Divide (word &r, Integer &q, const Integer &a, word d) + for (unsigned int i=0; i<128; ++i) + { + word r, d = prng.GenerateWord32(); + Integer q, a(prng, 1024); + Integer::Divide(r, q, a, d); + + Integer xr = a % Integer(Integer::POSITIVE, 0, d); + Integer xq = a / Integer(Integer::POSITIVE, 0, d); + result = (Integer(Integer::POSITIVE, 0, r) == xr) && (q == xq); + + pass = result && pass; + if (!result) + std::cout << "FAILED: Divide operation\n"; + } + + if (pass) + std::cout << "passed:"; + else + std::cout << "FAILED:"; + std::cout << " Divide operations\n"; + // ****************************** Integer Power2 ****************************** { -- cgit v1.2.1