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 modulus
bFactor
- second factor of poly
that poly = aFactor * bFactor mod modulus
public 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 modulus
bFactor
- second factor of poly
that poly = aFactor * bFactor mod modulus
public 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 modulus
bFactor
- second factor of poly
that poly = aFactor * bFactor mod modulus
public 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 modulus
bFactor
- second factor of poly
that poly = aFactor * bFactor mod modulus
public 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 modulus
bFactor
- second factor of poly
that poly = aFactor * bFactor mod modulus
public 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 modulus
bFactor
- second factor of poly
that poly = aFactor * bFactor mod modulus
public 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 modulus
bFactor
- second factor of poly
that poly = aFactor * bFactor mod modulus
public 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
modulus
desiredBound
- 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 desiredBound
public 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
modulus
finalModulus
- 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
modulus
desiredBound
- 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 desiredBound
public 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
modulus
desiredBound
- desired moduluspoly
- initial Z[x] polynomialmodularFactors
- factorization of poly.modulus(modulus)
poly.modulus(finalModulus)
with some finalModulus
greater than desiredBound
public 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
modulus
desiredBound
- desired moduluspoly
- initial Z[x] polynomialmodularFactors
- factorization of poly.modulus(modulus)
poly.modulus(finalModulus)
with some finalModulus
greater than desiredBound
Copyright © 2018. All rights reserved.