import java.util.*;
import java.lang.*;
import java.io.*;
import java.math.*;
class Ideone
{
{
int[] primes = { 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43,
47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,
101, 103, 107, 109, 113, 127, 131, 137, 139,
149, 151, 157, 163, 167, 173, 179, 181, 191};
// precompute inverses and bounds
for (int i = 0; i < primes.length; i++) {
inverses[i] = p.modInverse(m);
bounds[i] = m.divide(p);
}
for (int i = 0; i < primes.length; i++) {
isMultipleOf(x, inverses[i], bounds[i], m);
}
long t1
= System.
currentTimeMillis(); for (int j = 0; j < 100; j++)
for (int i = 0; i < primes.length; i++) {
if (isMultipleOf(x, inverses[i], bounds[i], m))
ignore = true;
}
long t2
= System.
currentTimeMillis(); for (int j = 0; j < 100; j++)
for (int i = 0; i < primes.length; i++) {
ignore = true;
}
long t3
= System.
currentTimeMillis(); System.
out.
println("Using inverses: " + (t2
- t1
) + " using remainder: " + (t3
- t2
));
for (int i = 0; i < primes.length; i++) {
if (isMultipleOf(x, inverses[i], bounds[i], m))
System.
out.
print(primes
[i
] + ", "); }
}
static volatile boolean ignore;
return value.multiply(inverse).and(m).compareTo(bound) <= 0;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLm1hdGguKjsKCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlpbnRbXSBwcmltZXMgPSB7IDMsIDUsIDcsIDExLCAxMywgMTcsIDE5LCAyMywgMjksIDMxLCAzNywgNDEsIDQzLAoJCQkJCQk0NywgNTMsIDU5LCA2MSwgNjcsIDcxLCA3MywgNzksIDgzLCA4OSwgOTcsCgkJCQkJCTEwMSwgMTAzLCAxMDcsIDEwOSwgMTEzLCAxMjcsIDEzMSwgMTM3LCAxMzksCgkJCQkJCTE0OSwgMTUxLCAxNTcsIDE2MywgMTY3LCAxNzMsIDE3OSwgMTgxLCAxOTF9OwoJCS8vIHByZWNvbXB1dGUgaW52ZXJzZXMgYW5kIGJvdW5kcwoJCUJpZ0ludGVnZXJbXSBpbnZlcnNlcyA9IG5ldyBCaWdJbnRlZ2VyW3ByaW1lcy5sZW5ndGhdOwoJCUJpZ0ludGVnZXJbXSBib3VuZHMgPSBuZXcgQmlnSW50ZWdlcltwcmltZXMubGVuZ3RoXTsKCQlCaWdJbnRlZ2VyIG0gPSBCaWdJbnRlZ2VyLlpFUk8uc2V0Qml0KDEzNDQpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJpbWVzLmxlbmd0aDsgaSsrKSB7CgkJCUJpZ0ludGVnZXIgcCA9IEJpZ0ludGVnZXIudmFsdWVPZihwcmltZXNbaV0pOwoJCQlpbnZlcnNlc1tpXSA9IHAubW9kSW52ZXJzZShtKTsKCQkJYm91bmRzW2ldID0gbS5kaXZpZGUocCk7CgkJfQoJCQoJCW0gPSBtLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTsKCQlCaWdJbnRlZ2VyIHggPSBCaWdJbnRlZ2VyLlpFUk8uc2V0Qml0KDEzMzApCgkJCS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmltZXMubGVuZ3RoOyBpKyspIHsKCQkJaXNNdWx0aXBsZU9mKHgsIGludmVyc2VzW2ldLCBib3VuZHNbaV0sIG0pOwoJCQl4LnJlbWFpbmRlcihCaWdJbnRlZ2VyLnZhbHVlT2YocHJpbWVzW2ldKSk7CgkJfQoJCQoJCWxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKCQlmb3IgKGludCBqID0gMDsgaiA8IDEwMDsgaisrKQoJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJpbWVzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChpc011bHRpcGxlT2YoeCwgaW52ZXJzZXNbaV0sIGJvdW5kc1tpXSwgbSkpCgkJCQlpZ25vcmUgPSB0cnVlOwoJCX0KCQlsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CgkJZm9yIChpbnQgaiA9IDA7IGogPCAxMDA7IGorKykKCQlmb3IgKGludCBpID0gMDsgaSA8IHByaW1lcy5sZW5ndGg7IGkrKykgewoJCQlpZiAoeC5yZW1haW5kZXIoQmlnSW50ZWdlci52YWx1ZU9mKHByaW1lc1tpXSkpLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKQoJCQkJaWdub3JlID0gdHJ1ZTsKCQl9CgkJbG9uZyB0MyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgaW52ZXJzZXM6ICIgKyAodDIgLSB0MSkgKyAiIHVzaW5nIHJlbWFpbmRlcjogIiArICh0MyAtIHQyKSk7CgkJCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmltZXMubGVuZ3RoOyBpKyspIHsKCQkJaWYgKGlzTXVsdGlwbGVPZih4LCBpbnZlcnNlc1tpXSwgYm91bmRzW2ldLCBtKSkKCQkJCVN5c3RlbS5vdXQucHJpbnQocHJpbWVzW2ldICsgIiwgIik7CgkJfQoJCVN5c3RlbS5vdXQucHJpbnRsbigpOwoJfQoJCglzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBpZ25vcmU7CgkKCXN0YXRpYyBib29sZWFuIGlzTXVsdGlwbGVPZihCaWdJbnRlZ2VyIHZhbHVlLCBCaWdJbnRlZ2VyIGludmVyc2UsIEJpZ0ludGVnZXIgYm91bmQsIEJpZ0ludGVnZXIgbSkgewoJCXJldHVybiB2YWx1ZS5tdWx0aXBseShpbnZlcnNlKS5hbmQobSkuY29tcGFyZVRvKGJvdW5kKSA8PSAwOwoJfQp9