Skip to content

Commit c27d3f8

Browse files
committed
push back latest sieve improvements to SIQS/PSIQS_U classes
1 parent 840c65c commit c27d3f8

File tree

10 files changed

+54
-1029
lines changed

10 files changed

+54
-1029
lines changed

src/de/tilman_neumann/jml/factor/CombinedFactorAlgorithm.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import de.tilman_neumann.jml.factor.siqs.sieve.Sieve;
4343
import de.tilman_neumann.jml.factor.siqs.sieve.Sieve03g;
4444
import de.tilman_neumann.jml.factor.siqs.sieve.Sieve03gU;
45+
import de.tilman_neumann.jml.factor.siqs.sieve.Sieve03hU;
4546
import de.tilman_neumann.jml.factor.siqs.tdiv.TDiv_QS_1Large_UBI;
4647
import de.tilman_neumann.jml.factor.siqs.tdiv.TDiv_QS_2Large_UBI;
4748
import de.tilman_neumann.jml.factor.tdiv.TDiv;
@@ -100,21 +101,24 @@ public CombinedFactorAlgorithm(int numberOfThreads) {
100101
public CombinedFactorAlgorithm(int numberOfThreads, Integer tdivLimit, boolean permitUnsafeUsage) {
101102
super(tdivLimit);
102103

103-
siqs_smallArgs = new SIQS(0.32F, 0.37F, null, new PowerOfSmallPrimesFinder(), new SIQSPolyGenerator(), new Sieve03gU(), new TDiv_QS_1Large_UBI(), 10, new MatrixSolver_Gauss02());
104+
Sieve smallSieve = permitUnsafeUsage ? new Sieve03gU() : new Sieve03g();
105+
siqs_smallArgs = new SIQS(0.32F, 0.37F, null, new PowerOfSmallPrimesFinder(), new SIQSPolyGenerator(), smallSieve, new TDiv_QS_1Large_UBI(), 10, new MatrixSolver_Gauss02());
104106

105107
if (numberOfThreads==1) {
106108
// Avoid multi-thread overhead if the requested number of threads is 1
107-
Sieve sieve = permitUnsafeUsage ? new Sieve03gU() : new Sieve03g();
108-
siqs_bigArgs = new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), sieve, new TDiv_QS_2Large_UBI(permitUnsafeUsage), 10, new MatrixSolver_BlockLanczos());
109+
if (permitUnsafeUsage) {
110+
siqs_bigArgs = new SIQS(0.31F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03hU(), new TDiv_QS_2Large_UBI(permitUnsafeUsage), 10, new MatrixSolver_BlockLanczos());
111+
} else {
112+
// XXX Here we'ld need some Sieve03h
113+
siqs_bigArgs = new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03g(), new TDiv_QS_2Large_UBI(permitUnsafeUsage), 10, new MatrixSolver_BlockLanczos());
114+
}
109115
} else {
110116
if (permitUnsafeUsage) {
111-
siqs_bigArgs = new PSIQS_U(0.32F, 0.37F, null, numberOfThreads, new NoPowerFinder(), new MatrixSolver_BlockLanczos());
117+
siqs_bigArgs = new PSIQS_U(0.31F, 0.37F, null, numberOfThreads, new NoPowerFinder(), new MatrixSolver_BlockLanczos());
112118
} else {
113-
siqs_bigArgs = new PSIQS(0.32F, 0.37F, null, numberOfThreads, new NoPowerFinder(), new MatrixSolver_BlockLanczos());
119+
siqs_bigArgs = new PSIQS(0.31F, 0.37F, null, numberOfThreads, new NoPowerFinder(), new MatrixSolver_BlockLanczos());
114120
}
115121
}
116-
117-
// Other options that perform well: PowerOfSmallPrimesFinder, SingleBlockHybridSieve(U).
118122
}
119123

120124
@Override

src/de/tilman_neumann/jml/factor/FactorizerTest.java

Lines changed: 24 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ public class FactorizerTest {
5757

5858
// algorithm options
5959
/** number of test numbers */
60-
private static final int N_COUNT = 100000;
60+
private static final int N_COUNT = 1;
6161
/** the bit size of N to start with */
62-
private static final int START_BITS = 30;
62+
private static final int START_BITS = 200;
6363
/** the increment in bit size from test set to test set */
64-
private static final int INCR_BITS = 1;
64+
private static final int INCR_BITS = 10;
6565
/** maximum number of bits to test (no maximum if null) */
6666
private static final Integer MAX_BITS = null;
6767
/** each algorithm is run REPEATS times for each input in order to reduce GC influence on timings */
@@ -95,7 +95,7 @@ public FactorizerTest() {
9595
// new Hart_TDiv_Race(),
9696
// new Hart_TDiv_Race2(),
9797
// new Hart_Squarefree(false), // best algorithm for semiprime N for 29 to 37 bit
98-
new Hart_Fast2Mult(false), // best algorithm for semiprime N for 38 to 45 bit
98+
// new Hart_Fast2Mult(false), // best algorithm for semiprime N for 38 to 45 bit
9999
// new Hart_Fast2Mult_FMA(false),
100100

101101
// Lehman
@@ -112,9 +112,9 @@ public FactorizerTest() {
112112
//new PollardRho31(),
113113
//new PollardRhoBrent31(),
114114
// new PollardRhoBrentMontgomeryR64Mul63(),
115-
new PollardRhoBrentMontgomery64(),
116-
new PollardRhoBrentMontgomery64_MH(),
117-
new PollardRhoBrentMontgomery64_MHInlined(),
115+
// new PollardRhoBrentMontgomery64(),
116+
// new PollardRhoBrentMontgomery64_MH(),
117+
// new PollardRhoBrentMontgomery64_MHInlined(),
118118

119119
// SquFoF variants
120120
// * pretty good, but never the best algorithm
@@ -137,54 +137,37 @@ public FactorizerTest() {
137137
// new CFrac63(true, 5, 1.5F, 0.152F, 0.25F, new TDiv_CF63_02(), 10, new MatrixSolver_Gauss02(), 12),
138138

139139
// ECM
140-
new TinyEcm64(),
141-
new TinyEcm64_MH(),
142-
new TinyEcm64_MHInlined(), // best algorithm for N from 46 to 62 bit
140+
// new TinyEcm64(),
141+
// new TinyEcm64_MH(),
142+
// new TinyEcm64_MHInlined(), // best algorithm for N from 46 to 62 bit
143143
// new EllipticCurveMethod(-1),
144144

145145
// SIQS:
146-
// * best until 220 bit: Sieve03gU + smallPowers + TDiv1L + Gauss
147-
// * best for 230, 240 bit: Sieve03gU + smallPowers + TDivnL + BL
148-
// * best for >= 250 bit: (Sieve03gU or SingleBlockHybridSieve) + (noPowers or smallPowers) + (TDiv2L or TDivnL) + BL
149-
// new SIQS_Small(0.305F, 0.37F, null, new SIQSPolyGenerator(), 10, true),
150-
146+
// small N
147+
// new SIQS_Small(0.32F, 0.37F, null, new SIQSPolyGenerator(), 10, true),
151148
// new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new SimpleSieve(), new TDiv_QS_1Large(), 10, new MatrixSolver_Gauss02()),
152149
// new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03g(), new TDiv_QS_1Large_UBI(), 10, new MatrixSolver_Gauss02()),
153150
// new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03gU(), new TDiv_QS_1Large(), 10, new MatrixSolver_Gauss02()),
154151
// new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03gU(), new TDiv_QS_1Large_UBI(), 10, new MatrixSolver_Gauss02()),
155152

156-
// new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03g(), new TDiv_QS_1Large_UBI(), 10, new MatrixSolver_BlockLanczos()),
157-
// new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03g(), new TDiv_QS_2Large_UBI(true), 10, new MatrixSolver_BlockLanczos()),
158-
// new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03g(), new TDiv_QS_nLarge(true), 10, new MatrixSolver_BlockLanczos()),
159-
// new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03g(), new TDiv_QS_nLarge_UBI(true), 10, new MatrixSolver_BlockLanczos()),
160-
// new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03gU(), new TDiv_QS_2Large_UBI(true), 10, new MatrixSolver_BlockLanczos()),
153+
// large N
154+
// new SIQS(0.31F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03gU(), new TDiv_QS_2Large_UBI(true), 10, new MatrixSolver_BlockLanczos()),
155+
// new SIQS(0.31F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03hU(), new TDiv_QS_2Large_UBI2(true), 10, new MatrixSolver_BlockLanczos()),
156+
// new SIQS(0.31F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03hU(), new TDiv_QS_2Large_UBI2(true), 10, new MatrixSolver_Gauss03()),
161157

162158
// sieving with prime powers: best sieve for small N!
163-
// new SIQS(0.32F, 0.37F, null, new PowerOfSmallPrimesFinder(), new SIQSPolyGenerator(), new Sieve03gU(), new TDiv_QS_1Large_UBI(), 10, new MatrixSolver_Gauss02()),
164-
// new SIQS(0.32F, 0.37F, null, new PowerOfSmallPrimesFinder(), new SIQSPolyGenerator(), new Sieve03gU(), new TDiv_QS_nLarge_UBI(true), 10, new MatrixSolver_BlockLanczos()),
165-
// new SIQS(0.32F, 0.37F, null, new AllPowerFinder(), new SIQSPolyGenerator(), new Sieve03gU(), new TDiv_QS_nLarge_UBI(true), 10, new MatrixSolver_BlockLanczos()),
166-
167-
// improved SIQS
168-
// new SIQS(0.32F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03gU(), new TDiv_QS_2Large_UBI(true), 10, new MatrixSolver_Gauss02()),
169-
// new SIQS2(0.31F, 0.37F, null, new NoPowerFinder(), new SIQSPolyGenerator(), new Sieve03hU(), new TDiv_QS_2Large_UBI2(true), 10, new MatrixSolver_Gauss02()),
159+
// new SIQS(0.31F, 0.37F, null, new PowerOfSmallPrimesFinder(), new SIQSPolyGenerator(), new Sieve03hU(), new TDiv_QS_2Large_UBI2(true), 10, new MatrixSolver_Gauss03()),
160+
// new SIQS(0.31F, 0.37F, null, new AllPowerFinder(), new SIQSPolyGenerator(), new Sieve03hU(), new TDiv_QS_2Large_UBI2(true), 10, new MatrixSolver_Gauss03()),
170161

171162
// Multi-threaded SIQS:
172-
// * 4/6 threads takes over at N around 100 bit (more exact estimates: 4 threads best for N>=88 bits, 6 threads for N>=112 bits)
173-
// * we need 0.14 < smoothBoundExponent < 0.2; everything else is prohibitive; use null for dynamic determination
174-
// * BlockLanczos is better than Gauss solver for N > 200 bit
175-
// new PSIQS(0.32F, 0.37F, null, 6, new NoPowerFinder(), new MatrixSolver_BlockLanczos()),
176-
// new PSIQS_U(0.32F, 0.37F, null, 20, new NoPowerFinder(), new MatrixSolver_PGauss01(10)),
177-
// new PSIQS_U(0.32F, 0.37F, null, 20, new NoPowerFinder(), new MatrixSolver_BlockLanczos()),
178-
// new PSIQS_U(0.32F, 0.37F, null, 6, new PowerOfSmallPrimesFinder(), new MatrixSolver_BlockLanczos()),
179-
// new PSIQS_U(0.32F, 0.37F, null, 6, new AllPowerFinder(), new MatrixSolver_BlockLanczos()),
180-
181-
// new PSIQS_U(0.32F, 0.37F, null, 20, new NoPowerFinder(), new MatrixSolver_BlockLanczos()),
182-
183-
// (0.31, 0.37) and (0.31, 0.365) are way better than (0.32, 0.37) for PSIQS_U2 !!
184-
// new PSIQS_U2(0.31F, 0.37F, null, 20, new NoPowerFinder(), new MatrixSolver_BlockLanczos()),
163+
// new PSIQS(0.32F, 0.37F, null, 16, new NoPowerFinder(), new MatrixSolver_BlockLanczos()),
164+
new PSIQS_U(0.31F, 0.37F, null, 16, new NoPowerFinder(), new MatrixSolver_PGauss01(16)),
165+
new PSIQS_U(0.31F, 0.37F, null, 16, new NoPowerFinder(), new MatrixSolver_BlockLanczos()),
166+
// new PSIQS_U(0.31F, 0.37F, null, 16, new PowerOfSmallPrimesFinder(), new MatrixSolver_BlockLanczos()),
167+
// new PSIQS_U(0.31F, 0.37F, null, 16, new AllPowerFinder(), new MatrixSolver_BlockLanczos()),
185168

186169
// Best combination of sub-algorithms for general factor arguments of any size
187-
// new CombinedFactorAlgorithm(6, 1<<16, true),
170+
// new CombinedFactorAlgorithm(16, 1<<16, true),
188171
};
189172
}
190173

src/de/tilman_neumann/jml/factor/psiqs/PSIQSBase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
import de.tilman_neumann.jml.factor.siqs.poly.PolyReport;
3737
import de.tilman_neumann.jml.factor.siqs.powers.PowerFinder;
3838
import de.tilman_neumann.jml.factor.siqs.sieve.SieveParams;
39-
import de.tilman_neumann.jml.factor.siqs.sieve.SieveParamsFactory01;
39+
import de.tilman_neumann.jml.factor.siqs.sieve.SieveParamsFactory02;
4040
import de.tilman_neumann.jml.factor.siqs.sieve.SieveReport;
4141
import de.tilman_neumann.jml.factor.siqs.tdiv.TDivReport;
4242
import de.tilman_neumann.jml.powers.PurePowerTest;
@@ -231,7 +231,7 @@ private BigInteger findSingleFactorInternal(BigInteger N) {
231231
congruenceCollector.initialize(N, primeBaseSize, matrixSolver, factorTest);
232232

233233
// compute some basic parameters for N
234-
SieveParams sieveParams = SieveParamsFactory01.create(N_dbl, NBits, kN, d, primesArray, primeBaseSize, adjustedSieveArraySize);
234+
SieveParams sieveParams = SieveParamsFactory02.create(N_dbl, NBits, kN, d, primesArray, primeBaseSize, adjustedSieveArraySize, apg.getQCount(), apg.getBestQ());
235235

236236
// compute logP array
237237
byte[] logPArray = computeLogPArray(primesArray, primeBaseSize, sieveParams.lnPMultiplier);

0 commit comments

Comments
 (0)