Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <chrono>
- #include <thread>
- #include "flint/fmpz.h"
- #include "flint/fmpz_factor.h"
- #include "flint/fmpz_mod.h"
- #include "flint/fmpz_mod_poly.h"
- #include "flint/fmpz_mod_poly_factor.h"
- int main() {
- auto start_t = std::chrono::high_resolution_clock::now();
- fmpz_t c;
- fmpz_init(c);
- fmpz_t NEG_n;
- fmpz_init(NEG_n);
- fmpz_t n;
- fmpz_init(n);
- fmpz_t POW_2;
- fmpz_init(POW_2);
- fmpz_set_str(POW_2, "115792089237316195423570985008687907853269984665640564039457584007913129639936", 10);
- fmpz_factor_t FACTOR_POW_2;
- fmpz_factor_init(FACTOR_POW_2);
- fmpz_factor_trial(FACTOR_POW_2, POW_2, 5);
- fmpz_mod_ctx_t fctx;
- fmpz_mod_ctx_init(fctx, POW_2);
- fmpz_mod_poly_t f;
- fmpz_mod_poly_init(f, fctx);
- fmpz_t c1, c2, c3;
- fmpz_init(c1);
- fmpz_init(c2);
- fmpz_init(c3);
- fmpz_mod_poly_factor_t fac;
- fmpz_mod_poly_factor_init(fac, fctx);
- // seed
- fmpz_t s;
- fmpz_init(s);
- // LCG computations
- fmpz_t tmp_s, seed_, seed__, p;
- fmpz_init(tmp_s);
- fmpz_init(seed_);
- fmpz_init(seed__);
- fmpz_init(p);
- const bool TEST = false;
- if (TEST) {
- fmpz_set_str(c, "2665094466720861055234275890206149281861672608341637838010768686997714133359", 10);
- fmpz_set_str(NEG_n, "75332168850584959901450179103897629190438040981617500425343266796883448566543", 10);
- fmpz_set_str(
- n,
- "353647571714999736072104341124233651057213714708122904095478713893663730479240157064601062897650458210097434355914183345289487500224919579787246530437698291448386975895645878510859951741892273473789376832458299170850654511827890650742439667469262292079621903414331289303262990543348537826168586893084656666639365398668042937310930241300947125293607516996378174061271609861706009834998660960746310857194103971415568823033216273952409246097935991158967396322492409845257613635102541420343856455273117905803133679299028997370937710655280339196930898550640285907237735222613222309441933270313866557915787734708826188169344041457185282000444780478621174270135326407805315529049804846216966427117104385937952974279806364471097245852872224811136040435472170916772342470378270588813990962599109861003795898230208201204127397300243952947417825482221500393640827813050410311877579176593552042943403534573002689069215752148429953951040588486638221708312774975369304688146593939770186918000813869836203172688167622244660598897840567413896048432967901665250552155403987746924573434732018828447909075483189331608192665316841486890959367260574465610825623614015714560909038952574085011646824604401272315196002098716845599996350838459792666015165681",
- 10);
- } else {
- fmpz_set_str(c, "14258939715516539295587731120991968901228171455016001595761489750577784177213", 10);
- fmpz_set_str(NEG_n, "1844117613169056713561974712208487723025450897929645549714183364695302665843", 10);
- fmpz_set_str(
- n,
- "279784521303926518544200383491171400996467006054806060652945044514173580730320793076951350168517896308345078513333979433742090849938580604359515861344088875721354836410510396140219655796215325682295239294661185563708496490830500773420871847769568879274978173218440545663363350310752698066412613793738234395676975963986090446949443295350235071286869321557833967521199446244573020803085515110891641843096725596572980675877230459500589604078432572911282759481893882548258867802789628543364574694501159808895930747113406016718685856976531978713324829507636743778130758650283045513372598798114943752532619142439604369129493324057181519512588183783756314385380800844831034863151900295735342816476791991454383732133474515109758087482912794282007801160780475284011802960270750792620686906175026995623082009841402872948756740311519047998978234628057595438481437871594714428834059691733188294695393205472914443179153321670750219104306769911019089432918102588905808629421158434486927928786793524017503900505368724824170796339023214910404096208544407500008089429770878575702088992309354303731919302687039737672125268143820658069899761163750521000478474705014645224845757836226858836333259628284972467671764606702417658922805838428375959908059533",
- 10);
- }
- fmpz_t c4;
- fmpz_init(c4);
- fmpz_mul_ui(c4, c, 4);
- fmpz_t c42;
- fmpz_init(c42);
- fmpz_mul(c42, c4, c4);
- fmpz_t c43;
- fmpz_init(c43);
- fmpz_mul(c43, c42, c4);
- unsigned long long iter = 0;
- unsigned long long primes = 0;
- for (unsigned long long N = 653;; ++N) {
- auto end_t = std::chrono::high_resolution_clock::now();
- auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end_t - start_t);
- printf("\x1b[32m[%11.3Lfm | %11.3Lfm / 1e9]\x1b[0m N = %llu\n", ((long double) elapsed.count()) / 60000.0, ((long double) elapsed.count() * 1e9) / (60000.0 * iter), N);
- if (primes >= 4) {
- printf("\x1b[35mProgram took %11.3Lf minutes.\x1b[0m\n", ((long double) elapsed.count()) / 60000.0);
- return 0;
- }
- // t1 = N
- for (unsigned long long t1 = N; t1 <= N; ++t1) {
- for (unsigned long long t2 = 1; t2 <= N; ++t2) {
- for (unsigned long long t3 = 1; t3 <= N; ++t3) {
- ++iter;
- fmpz_mul_ui(c3, c4, 3 * t1 + 2 * t2 + t3);
- fmpz_mul_ui(c2, c42, t1 * (2 * t1 + 2 * t2 + t3) + (t1 + t2) * (t1 + t2 + t3));
- fmpz_mul_ui(c1, c43, t1 * (t1 + t2) * (t1 + t2 + t3));
- fmpz_mod_poly_set_coeff_ui(f, 4, 1, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 3, c3, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 2, c2, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 1, c1, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 0, NEG_n, fctx);
- fmpz_mod_poly_roots_factored(fac, f, 1, FACTOR_POW_2, fctx);
- for (size_t idx = 0; idx < fac->num; ++idx) {
- // fmpz_mod_poly_print_pretty(fac->poly + idx, "x", fctx);
- fmpz_mod_poly_get_coeff_fmpz(s, fac->poly + idx, 0, fctx);
- fmpz_mod_neg(s, s, fctx);
- // test seed
- fmpz_mod_set_fmpz(seed_, s, fctx);
- for (unsigned long long t = 0; t <= t1 + t2 + t3; ++t) {
- // mutable version of seed_
- fmpz_mod_set_fmpz(seed__, seed_, fctx);
- // p = seed_
- fmpz_set(p, seed__);
- // p += ((seed_ - c) % 2^256) << 256
- fmpz_mod_sub_fmpz(seed__, seed__, c, fctx);
- fmpz_mul_2exp(tmp_s, seed__, 256);
- fmpz_add(p, p, tmp_s);
- // p += ((seed_ - c) % 2^256) << 512
- fmpz_mod_sub_fmpz(seed__, seed__, c, fctx);
- fmpz_mul_2exp(tmp_s, seed__, 512);
- fmpz_add(p, p, tmp_s);
- // p += ((seed_ - c) % 2^256) << 768
- fmpz_mod_sub_fmpz(seed__, seed__, c, fctx);
- fmpz_mul_2exp(tmp_s, seed__, 768);
- fmpz_add(p, p, tmp_s);
- if ((t == 0) && !fmpz_divisible(n, p)) {
- break;
- }
- // if (((t == 0) || (t == t1) || (t == t1 + t2) || (t == t1 + t2 + t3)) && fmpz_divisible(n, p)) {
- if ((t == 0) || (t == t1) || (t == t1 + t2) || (t == t1 + t2 + t3)) {
- printf("\x1b[36m");
- fmpz_print(p);
- printf("\x1b[0m\n");
- ++primes;
- }
- fmpz_add(seed_, seed_, c4);
- }
- }
- }
- }
- }
- // t2 = N
- for (unsigned long long t1 = 1; t1 <= N; ++t1) {
- for (unsigned long long t2 = N; t2 <= N; ++t2) {
- for (unsigned long long t3 = 1; t3 <= N; ++t3) {
- ++iter;
- fmpz_mul_ui(c3, c4, 3 * t1 + 2 * t2 + t3);
- fmpz_mul_ui(c2, c42, t1 * (2 * t1 + 2 * t2 + t3) + (t1 + t2) * (t1 + t2 + t3));
- fmpz_mul_ui(c1, c43, t1 * (t1 + t2) * (t1 + t2 + t3));
- fmpz_mod_poly_set_coeff_ui(f, 4, 1, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 3, c3, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 2, c2, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 1, c1, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 0, NEG_n, fctx);
- fmpz_mod_poly_roots_factored(fac, f, 1, FACTOR_POW_2, fctx);
- for (size_t idx = 0; idx < fac->num; ++idx) {
- // fmpz_mod_poly_print_pretty(fac->poly + idx, "x", fctx);
- fmpz_mod_poly_get_coeff_fmpz(s, fac->poly + idx, 0, fctx);
- fmpz_mod_neg(s, s, fctx);
- // test seed
- fmpz_mod_set_fmpz(seed_, s, fctx);
- for (unsigned long long t = 0; t <= t1 + t2 + t3; ++t) {
- // mutable version of seed_
- fmpz_mod_set_fmpz(seed__, seed_, fctx);
- // p = seed_
- fmpz_set(p, seed__);
- // p += ((seed_ - c) % 2^256) << 256
- fmpz_mod_sub_fmpz(seed__, seed__, c, fctx);
- fmpz_mul_2exp(tmp_s, seed__, 256);
- fmpz_add(p, p, tmp_s);
- // p += ((seed_ - c) % 2^256) << 512
- fmpz_mod_sub_fmpz(seed__, seed__, c, fctx);
- fmpz_mul_2exp(tmp_s, seed__, 512);
- fmpz_add(p, p, tmp_s);
- // p += ((seed_ - c) % 2^256) << 768
- fmpz_mod_sub_fmpz(seed__, seed__, c, fctx);
- fmpz_mul_2exp(tmp_s, seed__, 768);
- fmpz_add(p, p, tmp_s);
- if ((t == 0) && !fmpz_divisible(n, p)) {
- break;
- }
- // if (((t == 0) || (t == t1) || (t == t1 + t2) || (t == t1 + t2 + t3)) && fmpz_divisible(n, p)) {
- if ((t == 0) || (t == t1) || (t == t1 + t2) || (t == t1 + t2 + t3)) {
- printf("\x1b[36m");
- fmpz_print(p);
- printf("\x1b[0m\n");
- ++primes;
- }
- fmpz_add(seed_, seed_, c4);
- }
- }
- }
- }
- }
- // t3 = N
- for (unsigned long long t1 = 1; t1 <= N; ++t1) {
- for (unsigned long long t2 = 1; t2 <= N; ++t2) {
- for (unsigned long long t3 = N; t3 <= N; ++t3) {
- ++iter;
- fmpz_mul_ui(c3, c4, 3 * t1 + 2 * t2 + t3);
- fmpz_mul_ui(c2, c42, t1 * (2 * t1 + 2 * t2 + t3) + (t1 + t2) * (t1 + t2 + t3));
- fmpz_mul_ui(c1, c43, t1 * (t1 + t2) * (t1 + t2 + t3));
- fmpz_mod_poly_set_coeff_ui(f, 4, 1, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 3, c3, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 2, c2, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 1, c1, fctx);
- fmpz_mod_poly_set_coeff_fmpz(f, 0, NEG_n, fctx);
- // if ((t1 == 79) && (t2 == 116) && (t3 == 131)) {
- // fmpz_mod_poly_print_pretty(f, "x", fctx);
- // printf("\n");
- // fmpz_mod_poly_factor_print_pretty(fac, "x", fctx);
- // printf("\n");
- // }
- fmpz_mod_poly_roots_factored(fac, f, 1, FACTOR_POW_2, fctx);
- for (size_t idx = 0; idx < fac->num; ++idx) {
- // fmpz_mod_poly_print_pretty(fac->poly + idx, "x", fctx);
- fmpz_mod_poly_get_coeff_fmpz(s, fac->poly + idx, 0, fctx);
- fmpz_mod_neg(s, s, fctx);
- // test seed
- fmpz_mod_set_fmpz(seed_, s, fctx);
- for (unsigned long long t = 0; t <= t1 + t2 + t3; ++t) {
- // mutable version of seed_
- fmpz_mod_set_fmpz(seed__, seed_, fctx);
- // p = seed_
- fmpz_set(p, seed__);
- // p += ((seed_ - c) % 2^256) << 256
- fmpz_mod_sub_fmpz(seed__, seed__, c, fctx);
- fmpz_mul_2exp(tmp_s, seed__, 256);
- fmpz_add(p, p, tmp_s);
- // p += ((seed_ - c) % 2^256) << 512
- fmpz_mod_sub_fmpz(seed__, seed__, c, fctx);
- fmpz_mul_2exp(tmp_s, seed__, 512);
- fmpz_add(p, p, tmp_s);
- // p += ((seed_ - c) % 2^256) << 768
- fmpz_mod_sub_fmpz(seed__, seed__, c, fctx);
- fmpz_mul_2exp(tmp_s, seed__, 768);
- fmpz_add(p, p, tmp_s);
- if ((t == 0) && !fmpz_divisible(n, p)) {
- break;
- }
- // if (((t == 0) || (t == t1) || (t == t1 + t2) || (t == t1 + t2 + t3)) && fmpz_divisible(n, p)) {
- if ((t == 0) || (t == t1) || (t == t1 + t2) || (t == t1 + t2 + t3)) {
- printf("\x1b[36m");
- fmpz_print(p);
- printf("\x1b[0m\n");
- ++primes;
- }
- fmpz_add(seed_, seed_, c4);
- }
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement