| 621 | } |
| 622 | |
| 623 | bool SolveModularQuadraticEquation(Integer &r1, Integer &r2, const Integer &a, const Integer &b, const Integer &c, const Integer &p) |
| 624 | { |
| 625 | Integer D = (b.Squared() - 4*a*c) % p; |
| 626 | switch (Jacobi(D, p)) |
| 627 | { |
| 628 | default: |
| 629 | CRYPTOPP_ASSERT(false); // not reached |
| 630 | return false; |
| 631 | case -1: |
| 632 | return false; |
| 633 | case 0: |
| 634 | r1 = r2 = (-b*(a+a).InverseMod(p)) % p; |
| 635 | CRYPTOPP_ASSERT(((r1.Squared()*a + r1*b + c) % p).IsZero()); |
| 636 | return true; |
| 637 | case 1: |
| 638 | Integer s = ModularSquareRoot(D, p); |
| 639 | Integer t = (a+a).InverseMod(p); |
| 640 | r1 = (s-b)*t % p; |
| 641 | r2 = (-s-b)*t % p; |
| 642 | CRYPTOPP_ASSERT(((r1.Squared()*a + r1*b + c) % p).IsZero()); |
| 643 | CRYPTOPP_ASSERT(((r2.Squared()*a + r2*b + c) % p).IsZero()); |
| 644 | return true; |
| 645 | } |
| 646 | } |
| 647 | |
| 648 | Integer ModularRoot(const Integer &a, const Integer &dp, const Integer &dq, |
| 649 | const Integer &p, const Integer &q, const Integer &u) |
no test coverage detected