Class HenselLifting


  • public final class HenselLifting
    extends Object
    Methods for univariate Hensel lifting.

    Implementation notes. Two methods for Hensel lift are implemented: quadratic and linear. For N iterations quadratic lift will lift to p2^N while linear just to pN. While quadratic lift converges much faster, it works with BigIntegers in all intermediate steps, so each step is quite expensive. Linear lift is implemented so that it starts with machine-word modulus, and perform all hard intermediate calculations with machine-word arithmetic, converting to BigIntegers only a few times. In this way, a single step of linear lift is very cheap, but the convergence is worse. The actual lifting used in factorization switches between linear and quadratic lift in order to obtain the best trade-off. NOTE: Quadratic lifts may fail in Z/2

    Since:
    1.0
    • Method Detail

      • liftFactorization

        public static List<UnivariatePolynomialZp64> liftFactorization​(long modulus,
                                                                       long desiredBound,
                                                                       UnivariatePolynomialZ64 poly,
                                                                       List<UnivariatePolynomialZp64> modularFactors,
                                                                       boolean quadratic)
        Lifts modular factorization until modulus will overcome desiredBound.
        Parameters:
        modulus - initial modulus so that modularFactors are true factors of poly mod modulus
        desiredBound - desired modulus
        poly - initial Z[x] polynomial
        modularFactors - factorization of poly.modulus(modulus)
        quadratic - whether to use quadratic of linear lift
        Returns:
        factorization of poly.modulus(finalModulus) with some finalModulus greater than desiredBound
      • liftFactorization

        public static List<UnivariatePolynomialZp64> liftFactorization​(long modulus,
                                                                       long finalModulus,
                                                                       int nIterations,
                                                                       UnivariatePolynomialZ64 poly,
                                                                       List<UnivariatePolynomialZp64> modularFactors,
                                                                       boolean quadratic)
        Lifts modular factorization nIterations times using whether linear or quadratic lifting.
        Parameters:
        modulus - initial modulus so that modularFactors are true factors of poly mod modulus
        finalModulus - final modulus that will be obtained after lifting
        nIterations - number of lifting steps to do
        poly - initial Z[x] polynomial
        modularFactors - factorization of poly.modulus(modulus)
        quadratic - whether to use quadratic of linear lift
        Returns:
        factorization of poly.modulus(finalModulus)
      • liftFactorization

        public static List<UnivariatePolynomial<BigInteger>> liftFactorization​(BigInteger modulus,
                                                                               BigInteger desiredBound,
                                                                               UnivariatePolynomial<BigInteger> poly,
                                                                               List<UnivariatePolynomialZp64> modularFactors,
                                                                               boolean quadratic)
        Lifts modular factorization until modulus will overcome desiredBound. Note: if quadratic == false modulus must fit 64-bit.
        Parameters:
        modulus - initial modulus so that modularFactors are true factors of poly mod modulus
        desiredBound - desired modulus
        poly - initial Z[x] polynomial
        modularFactors - factorization of poly.modulus(modulus)
        quadratic - whether to use quadratic of linear lift
        Returns:
        factorization of poly.modulus(finalModulus) with some finalModulus greater than desiredBound
      • liftFactorizationQuadratic

        public static List<UnivariatePolynomial<BigInteger>> liftFactorizationQuadratic​(BigInteger modulus,
                                                                                        BigInteger desiredBound,
                                                                                        UnivariatePolynomial<BigInteger> poly,
                                                                                        List<UnivariatePolynomial<BigInteger>> modularFactors)
        Lifts modular factorization until modulus will overcome desiredBound.
        Parameters:
        modulus - initial modulus so that modularFactors are true factors of poly mod modulus
        desiredBound - desired modulus
        poly - initial Z[x] polynomial
        modularFactors - factorization of poly.modulus(modulus)
        Returns:
        factorization of poly.modulus(finalModulus) with some finalModulus greater than desiredBound
      • liftFactorization

        public static List<UnivariatePolynomial<BigInteger>> liftFactorization​(BigInteger modulus,
                                                                               BigInteger desiredBound,
                                                                               UnivariatePolynomial<BigInteger> poly,
                                                                               List<UnivariatePolynomialZp64> modularFactors)
        Lifts modular factorization until modulus will overcome desiredBound. Implementation note: method will switch between linear and quadratic lift depending on the required lifting iterations.
        Parameters:
        modulus - initial modulus so that modularFactors are true factors of poly mod modulus
        desiredBound - desired modulus
        poly - initial Z[x] polynomial
        modularFactors - factorization of poly.modulus(modulus)
        Returns:
        factorization of poly.modulus(finalModulus) with some finalModulus greater than desiredBound