private static BigInteger solveQuadraticEquation(BigInteger n, BigInteger r, BigInteger s) { BigInteger det = r.multiply(r).subtract(s.shiftLeft(2)).mod(n); BigInteger root = new ECFieldElement.Fp(n, det).sqrt().toBigInteger(); if (!root.testBit(0)) { root = n.subtract(root); } return root.shiftRight(1); // NOTE: implicit -1 of the low-bit }
private static BigInteger[] solveQuadraticEquation(BigInteger n, BigInteger r, BigInteger s) { BigInteger det = r.multiply(r).subtract(s.shiftLeft(2)).mod(n); BigInteger root1 = new ECFieldElement.Fp(n, det).sqrt().toBigInteger(), root2 = n.subtract(root1); if (root1.testBit(0)) { root2 = root2.add(n); } else { root1 = root1.add(n); } // assert root1.testBit(0); // assert root2.testBit(0); // NOTE: implicit -1 of the low-bits return new BigInteger[]{ root1.shiftRight(1), root2.shiftRight(1) }; }