Package cc.redberry.rings.poly.univar
Class HenselLifting
- java.lang.Object
-
- cc.redberry.rings.poly.univar.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
Niterations 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
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classHenselLifting.bLinearLiftLinear Hensel lift for BigIntegers arithmetics.static classHenselLifting.bQuadraticLiftQuadratic Hensel lift for BigIntegers arithmetics.static interfaceHenselLifting.LiftableQuintet<PolyZp extends IUnivariatePolynomial<PolyZp>>Liftable quintet.static classHenselLifting.lLinearLiftLinear Hensel lift for machine word arithmetics.static classHenselLifting.lQuadraticLiftQuadratic Hensel lift for machine word arithmetics.
-
Method Summary
-
-
-
Method Detail
-
createQuadraticLift
public static HenselLifting.lQuadraticLift createQuadraticLift(long modulus, UnivariatePolynomialZ64 poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
Creates quadratic Hensel lift.- Parameters:
modulus- the initial moduluspoly- Z[x] polynomialaFactor- first factor ofpolythatpoly = aFactor * bFactor mod modulusbFactor- second factor ofpolythatpoly = aFactor * bFactor mod modulus- Returns:
- quadratic Hensel lift
-
createQuadraticLift
public static HenselLifting.bQuadraticLift createQuadraticLift(BigInteger modulus, UnivariatePolynomial<BigInteger> poly, UnivariatePolynomial<BigInteger> aFactor, UnivariatePolynomial<BigInteger> bFactor)
Creates quadratic Hensel lift.- Parameters:
modulus- the initial moduluspoly- Z[x] polynomialaFactor- first factor ofpolythatpoly = aFactor * bFactor mod modulusbFactor- second factor ofpolythatpoly = aFactor * bFactor mod modulus- Returns:
- quadratic Hensel lift
-
createQuadraticLift
public static HenselLifting.bQuadraticLift createQuadraticLift(BigInteger modulus, UnivariatePolynomial<BigInteger> poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
Creates quadratic Hensel lift.- Parameters:
modulus- the initial moduluspoly- Z[x] polynomialaFactor- first factor ofpolythatpoly = aFactor * bFactor mod modulusbFactor- second factor ofpolythatpoly = aFactor * bFactor mod modulus- Returns:
- quadratic Hensel lift
-
createLinearLift
public static HenselLifting.lLinearLift createLinearLift(BigInteger modulus, UnivariatePolynomialZ64 poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
Creates linear Hensel lift.- Parameters:
modulus- the initial moduluspoly- Z[x] polynomialaFactor- first factor ofpolythatpoly = aFactor * bFactor mod modulusbFactor- second factor ofpolythatpoly = aFactor * bFactor mod modulus- Returns:
- linear Hensel lift
-
createLinearLift
public static HenselLifting.bLinearLift createLinearLift(BigInteger modulus, UnivariatePolynomial<BigInteger> poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
Creates linear Hensel lift.- Parameters:
modulus- the initial moduluspoly- Z[x] polynomialaFactor- first factor ofpolythatpoly = aFactor * bFactor mod modulusbFactor- second factor ofpolythatpoly = aFactor * bFactor mod modulus- Returns:
- linear Hensel lift
-
createLinearLift
public static HenselLifting.lLinearLift createLinearLift(long modulus, UnivariatePolynomialZ64 poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
Creates linear Hensel lift.- Parameters:
modulus- the initial moduluspoly- Z[x] polynomialaFactor- first factor ofpolythatpoly = aFactor * bFactor mod modulusbFactor- second factor ofpolythatpoly = aFactor * bFactor mod modulus- Returns:
- linear Hensel lift
-
createLinearLift
public static HenselLifting.bLinearLift createLinearLift(long modulus, UnivariatePolynomial<BigInteger> poly, UnivariatePolynomialZp64 aFactor, UnivariatePolynomialZp64 bFactor)
Creates linear Hensel lift.- Parameters:
modulus- the initial moduluspoly- Z[x] polynomialaFactor- first factor ofpolythatpoly = aFactor * bFactor mod modulusbFactor- second factor ofpolythatpoly = aFactor * bFactor mod modulus- Returns:
- linear Hensel lift
-
liftFactorization
public static List<UnivariatePolynomialZp64> liftFactorization(long modulus, long desiredBound, UnivariatePolynomialZ64 poly, List<UnivariatePolynomialZp64> modularFactors, boolean quadratic)
Lifts modular factorization untilmoduluswill overcomedesiredBound.- Parameters:
modulus- initial modulus so thatmodularFactorsare true factors ofpoly mod modulusdesiredBound- desired moduluspoly- initial Z[x] polynomialmodularFactors- factorization ofpoly.modulus(modulus)quadratic- whether to use quadratic of linear lift- Returns:
- factorization of
poly.modulus(finalModulus)with somefinalModulusgreater thandesiredBound
-
liftFactorization
public static List<UnivariatePolynomialZp64> liftFactorization(long modulus, long finalModulus, int nIterations, UnivariatePolynomialZ64 poly, List<UnivariatePolynomialZp64> modularFactors, boolean quadratic)
Lifts modular factorizationnIterationstimes using whether linear or quadratic lifting.- Parameters:
modulus- initial modulus so thatmodularFactorsare true factors ofpoly mod modulusfinalModulus- final modulus that will be obtained after liftingnIterations- number of lifting steps to dopoly- initial Z[x] polynomialmodularFactors- factorization ofpoly.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 untilmoduluswill overcomedesiredBound. Note: ifquadratic == falsemodulus must fit 64-bit.- Parameters:
modulus- initial modulus so thatmodularFactorsare true factors ofpoly mod modulusdesiredBound- desired moduluspoly- initial Z[x] polynomialmodularFactors- factorization ofpoly.modulus(modulus)quadratic- whether to use quadratic of linear lift- Returns:
- factorization of
poly.modulus(finalModulus)with somefinalModulusgreater thandesiredBound
-
liftFactorizationQuadratic
public static List<UnivariatePolynomial<BigInteger>> liftFactorizationQuadratic(BigInteger modulus, BigInteger desiredBound, UnivariatePolynomial<BigInteger> poly, List<UnivariatePolynomial<BigInteger>> modularFactors)
Lifts modular factorization untilmoduluswill overcomedesiredBound.- Parameters:
modulus- initial modulus so thatmodularFactorsare true factors ofpoly mod modulusdesiredBound- desired moduluspoly- initial Z[x] polynomialmodularFactors- factorization ofpoly.modulus(modulus)- Returns:
- factorization of
poly.modulus(finalModulus)with somefinalModulusgreater thandesiredBound
-
liftFactorization
public static List<UnivariatePolynomial<BigInteger>> liftFactorization(BigInteger modulus, BigInteger desiredBound, UnivariatePolynomial<BigInteger> poly, List<UnivariatePolynomialZp64> modularFactors)
Lifts modular factorization untilmoduluswill overcomedesiredBound. Implementation note: method will switch between linear and quadratic lift depending on the required lifting iterations.- Parameters:
modulus- initial modulus so thatmodularFactorsare true factors ofpoly mod modulusdesiredBound- desired moduluspoly- initial Z[x] polynomialmodularFactors- factorization ofpoly.modulus(modulus)- Returns:
- factorization of
poly.modulus(finalModulus)with somefinalModulusgreater thandesiredBound
-
-