Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void benchmark(void)
- {
- unsigned long int re = 0, wyn = 0, re2 = 0, re3 = 0;
- unsigned long int an[33];
- unsigned long int bn[33];
- unsigned long int ds[2];
- uint64_t dist = 0, now = 0;
- double temp1 = 0;
- unsigned long int wn[33];
- unsigned long int aa = 0, bb = 0, cc = 0, dd = 0;
- mpz_t n,start,end,remainder,currentNumber, qu, mul, res, b1, b2, wyn1, wyn2, result;
- mpz_t n2;
- size_t a = 0, b=0, w=0, d=0;
- mpz_init_set_str(n, "B98E7F4EE7C2FA971E4807B619133C2859ECD24FEDE69CC6C096E7701C77F07C24FAC4C39B40C159CF8C8F9981C2FFD00C862359BC43592FA9B8591967EE0EC5C9EE401F69249610EEB7DCA96644ABB8E16AABEAC64FCF0A5140529F0B220E3C68097E28B6BCC96C3F778A8DA5582CF6AE7CFEC62612E1AFCE462CF0A1396A7F", 16);
- mpz_init(qu);
- mpz_init(res);
- mpz_init(start);
- mpz_sqrt(start, n);
- mpz_out_str(stderr, 16, start);
- mpz_init(end);
- mpz_init_set_ui(result, 0);
- mpz_init(wyn1);
- mpz_init(wyn2);
- mpz_add_ui(end, start, 1000000000);
- mpz_add_ui(end, end, 1000000000);
- mpz_add_ui(end, end, 1000000000);
- mpz_add_ui(end, end, 1000000000);
- mpz_add_ui(end, end, 1000000000);
- mpz_add_ui(end, end, 1000000000);
- mpz_add_ui(end, end, 1000000000);
- mpz_add_ui(end, end, 1000000000);
- mpz_add_ui(end, end, 1000000000);
- mpz_add_ui(end, end, 1000000000);
- mpz_init2(remainder, 1024);
- mpz_init2(mul, 1024);
- mpz_init_set(currentNumber, start);
- mpz_init2(n2, 1024);
- mpz_init(b1);
- mpz_init(b2);
- if(mpz_even_p(currentNumber))
- mpz_sub_ui(currentNumber, currentNumber, 1);
- fprintf(stderr, "RSA: Starting Benchmark.\n");
- counter.Start();
- mpz_cdiv_qr(qu, remainder, n, currentNumber);
- mpz_set(wyn1, remainder);
- if(mpz_cmp_ui(remainder, 0) == 0)
- {
- mpz_set(result, currentNumber);
- fprintf(stderr, "RSA: ending, found a result.\n");
- }
- mpz_add_ui(currentNumber, currentNumber, 2);
- now += 2;
- mpz_sub_ui(qu, qu, 2);
- mpz_export(wn, &w, 1, 4, 0, 0, n);
- wyn = wn[w-1];
- wyn = wyn & 0xFFFF;
- /*
- test this optimization for correct results
- simple school mul is
- AB
- CD
- _______
- BD
- AD
- CB
- + AC
- So last bit (D) are always same after first mul. To be sure in 110% we check only last 16 bits.
- */
- /*
- mpz_init_set(n1, start);
- mpz_mul(n2, n1, n1);
- mpz_export(wn, &w, 1, 4, 0, 0, n2);
- wyn = wn[w-1];
- wyn = wyn & 0xFFFF;
- mpz_export(an, &a, 1, 4, 0, 0, n1);
- mpz_export(bn, &b, 1, 4, 0, 0, n1);
- re = (an[a-1] * bn[b-1]) & 0xFFFF;*/
- mpz_export(an, &a, 1, 4, 0, 0, qu);
- mpz_export(bn, &b, 1, 4, 0, 0, currentNumber);
- aa = an[a-1];
- bb = bn[b-1];
- //dist
- mpz_sub(res, end, start);
- temp1 = mpz_get_d(res);
- dist = (uint64_t)temp1;
- while (now < dist)
- {
- //mpz_export(an, &a, 1, 4, 0, 0, qu);
- //mpz_export(bn, &b, 1, 4, 0, 0, currentNumber);
- //mul 32x32 bit
- //check last 16 bits
- //re = (an[a-1] * bn[b-1]) & 0xFFFF;
- re2 = (aa * bb) & 0xFFFF;
- //if(re != re2)
- // printf("Ups...\n");
- if((re2 ^ wyn) == 0)
- {
- ds[1] = now & 0xFFFFFFFF;
- ds[0] = now >> 32;
- mpz_import (res, 2, 1, sizeof(ds[0]), 0, 0, ds);
- mpz_sub(qu, qu, res);
- mpz_add(currentNumber, currentNumber, res);
- mpz_mul(mul, qu, currentNumber);
- if(mpz_cmp(mul, n) == 0)
- {
- fprintf(stderr, "RSA: ending, found a result.\n");
- mpz_set(result, currentNumber);
- }
- }
- aa -= 2;
- bb += 2;
- now += 2;
- //mpz_sub_ui(qu, qu, 2);
- //mpz_add_ui(currentNumber, currentNumber, 2);
- }
- mpz_clear(n);
- mpz_clear(start);
- mpz_clear(end);
- mpz_clear(remainder);
- mpz_clear(currentNumber);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement