public final class HenselLifting extends Object
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
| Modifier and Type | Class and Description |
|---|---|
static class |
HenselLifting.bLinearLift
Linear Hensel lift for BigIntegers arithmetics.
|
static class |
HenselLifting.bQuadraticLift
Quadratic Hensel lift for BigIntegers arithmetics.
|
static interface |
HenselLifting.LiftableQuintet<PolyZp extends IUnivariatePolynomial<PolyZp>>
Liftable quintet.
|
static class |
HenselLifting.lLinearLift
Linear Hensel lift for machine word arithmetics.
|
static class |
HenselLifting.lQuadraticLift
Quadratic Hensel lift for machine word arithmetics.
|
public static HenselLifting.lQuadraticLift createQuadraticLift(long modulus, UnivariatePolynomialZ64 poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
modulus - the initial moduluspoly - Z[x] polynomialaFactor - first factor of poly that poly = aFactor * bFactor mod modulusbFactor - second factor of poly that poly = aFactor * bFactor mod moduluspublic static HenselLifting.bQuadraticLift createQuadraticLift(BigInteger modulus, UnivariatePolynomial<BigInteger> poly, UnivariatePolynomial<BigInteger> aFactor, UnivariatePolynomial<BigInteger> bFactor)
modulus - the initial moduluspoly - Z[x] polynomialaFactor - first factor of poly that poly = aFactor * bFactor mod modulusbFactor - second factor of poly that poly = aFactor * bFactor mod moduluspublic static HenselLifting.bQuadraticLift createQuadraticLift(BigInteger modulus, UnivariatePolynomial<BigInteger> poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
modulus - the initial moduluspoly - Z[x] polynomialaFactor - first factor of poly that poly = aFactor * bFactor mod modulusbFactor - second factor of poly that poly = aFactor * bFactor mod moduluspublic static HenselLifting.lLinearLift createLinearLift(BigInteger modulus, UnivariatePolynomialZ64 poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
modulus - the initial moduluspoly - Z[x] polynomialaFactor - first factor of poly that poly = aFactor * bFactor mod modulusbFactor - second factor of poly that poly = aFactor * bFactor mod moduluspublic static HenselLifting.bLinearLift createLinearLift(BigInteger modulus, UnivariatePolynomial<BigInteger> poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
modulus - the initial moduluspoly - Z[x] polynomialaFactor - first factor of poly that poly = aFactor * bFactor mod modulusbFactor - second factor of poly that poly = aFactor * bFactor mod moduluspublic static HenselLifting.lLinearLift createLinearLift(long modulus, UnivariatePolynomialZ64 poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
modulus - the initial moduluspoly - Z[x] polynomialaFactor - first factor of poly that poly = aFactor * bFactor mod modulusbFactor - second factor of poly that poly = aFactor * bFactor mod moduluspublic static HenselLifting.bLinearLift createLinearLift(long modulus, UnivariatePolynomial<BigInteger> poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
modulus - the initial moduluspoly - Z[x] polynomialaFactor - first factor of poly that poly = aFactor * bFactor mod modulusbFactor - second factor of poly that poly = aFactor * bFactor mod moduluspublic static List<UnivariatePolynomialZp64> liftFactorization(long modulus, long desiredBound, UnivariatePolynomialZ64 poly, List<UnivariatePolynomialZp64> modularFactors, boolean quadratic)
modulus will overcome desiredBound.modulus - initial modulus so that modularFactors are true factors of poly mod
modulusdesiredBound - desired moduluspoly - initial Z[x] polynomialmodularFactors - factorization of poly.modulus(modulus)quadratic - whether to use quadratic of linear liftpoly.modulus(finalModulus) with some finalModulus greater than desiredBoundpublic static List<UnivariatePolynomialZp64> liftFactorization(long modulus, long finalModulus, int nIterations, UnivariatePolynomialZ64 poly, List<UnivariatePolynomialZp64> modularFactors, boolean quadratic)
nIterations times using whether linear or quadratic lifting.modulus - initial modulus so that modularFactors are true factors of poly mod
modulusfinalModulus - final modulus that will be obtained after liftingnIterations - number of lifting steps to dopoly - initial Z[x] polynomialmodularFactors - factorization of poly.modulus(modulus)quadratic - whether to use quadratic of linear liftpoly.modulus(finalModulus) public static List<UnivariatePolynomial<BigInteger>> liftFactorization(BigInteger modulus, BigInteger desiredBound, UnivariatePolynomial<BigInteger> poly, List<UnivariatePolynomialZp64> modularFactors, boolean quadratic)
modulus will overcome desiredBound. Note: if quadratic == false modulus must fit 64-bit.modulus - initial modulus so that modularFactors are true factors of poly mod
modulusdesiredBound - desired moduluspoly - initial Z[x] polynomialmodularFactors - factorization of poly.modulus(modulus)quadratic - whether to use quadratic of linear liftpoly.modulus(finalModulus) with some finalModulus greater than desiredBoundpublic static List<UnivariatePolynomial<BigInteger>> liftFactorizationQuadratic(BigInteger modulus, BigInteger desiredBound, UnivariatePolynomial<BigInteger> poly, List<UnivariatePolynomial<BigInteger>> modularFactors)
modulus will overcome desiredBound.modulus - initial modulus so that modularFactors are true factors of poly mod
modulusdesiredBound - desired moduluspoly - initial Z[x] polynomialmodularFactors - factorization of poly.modulus(modulus)poly.modulus(finalModulus) with some finalModulus greater than desiredBoundpublic static List<UnivariatePolynomial<BigInteger>> liftFactorization(BigInteger modulus, BigInteger desiredBound, UnivariatePolynomial<BigInteger> poly, List<UnivariatePolynomialZp64> modularFactors)
modulus will overcome desiredBound. Implementation note:
method will switch between linear and quadratic lift depending on the required lifting iterations.modulus - initial modulus so that modularFactors are true factors of poly mod
modulusdesiredBound - desired moduluspoly - initial Z[x] polynomialmodularFactors - factorization of poly.modulus(modulus)poly.modulus(finalModulus) with some finalModulus greater than desiredBoundCopyright © 2022. All rights reserved.