как смешно однако - где это я себя гениальным математиком называл??)) и, если тебе метода кажется ересью - мне любопытно увидеть доводы (уж извините, такой я любопытный)))
Хвалиться знанием матемматики я не буду, так что за доводами обращайся на соответствующий форум. Я человек практичный, и поэтому о всем сужу только по результатам. Если у меня есть GNFS, которым реально факторизовать 512 бит на небольшой распределеной сети, то мне не нужны никакие другие методы, если они не дотягивают до него в эффективности. Поэтому хотелось бы увидеть твои бенчмарки хотя-бы для 256 битных чисел (в сравнении с MPQS и GNFS).
Тоже самое могу сказать и о себе)) - разберусь с архиватором, тогда пропишу ету методу иль кто-нить пропишет и практика поставит все точки над i, хотя эта метода далеко не то, что я хотел бы узреть))
вот код почти усех метод, кои я настрокал, так же есть код full order и родственного ему шифта. Если кто хочет тест драйва - либу gmp и все нужные хедеры берите тут: http://xproject-all.narod.ru/csc_algo_debug_ver.7z ---------------------------------------------------------------------------------------------------------- Результаты опубликуйте здесь или сообщите мне по мылу, плзззззззззззззз..зз ---------------------------------------------------------------------------------------------------------- Код (Text): // Catcher_of_Secret_Key.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <windows.h> //#include "windows.h" //#include "Winuser.h" //#include "Wincon.h" //#include "Wingdi.h" #include <math.h> //#include "stdio.h" #include "conio.h" //#include <iostream> #include "iso646.h" #include <locale.h> //#include <stdlib.h> #include <time.h> #include "gmpxx.h" #include "gmp.h" #include "mpfr.h" #include "mpf2mpfr.h" #pragma comment (lib, "gmp1.lib") //#pragma comment (lib, "gmpd.lib") //#pragma comment (lib, "libbz2.lib") //#pragma comment (lib, "libbz2d.lib") //#pragma comment (lib, "zlib.lib") //#pragma comment (lib, "zlibd.lib") //#pragma comment (lib, "wingmp.lib") //#include "mpfrxx.h" //#include "gmp.h" //#include "gmp.h" //#using <gmp.dll> mpz_t nl; typedef unsigned long ul; typedef unsigned __int64 ui64; using namespace std; void inline mod(mpz_t n, mpz_t *q, mpz_t *tmp){ // mpf_t tmp; if(mpz_cmp_ui(*q,1)>0){ mpz_div(*tmp, n, *q); // mpz_floor(tmp, tmp); mpz_mul(*tmp,*q, *tmp); mpz_sub(n, n, *tmp); // n-=floor(n/abs(*q))**q; } return; } //long double mod(long double n, long double *q){ // if(*q>1) n-=floor(n/abs(*q))**q; // return n; // } void series(mpz_t &n, mpz_t &base_c, ui64 basis, ui64 iter){ mpz_set_ui(base_c, basis); for(;iter>0; iter--){ mpz_mul_ui(base_c, base_c, 2); mpz_add_ui(base_c, base_c, 1); } return; } int inline test_frac(mpf_t *p){ mpf_t tmp; mpf_floor(tmp, *p); if (mpf_cmp(*p, tmp)>0) return 2; else return 0; } BOOL WINAPI welcome( DWORD msg ){ if(msg==CTRL_CLOSE_EVENT){MessageBox(0, "GOO..OD LUCK to YOU!!", "Thanks for using this app", MB_ICONWARNING|MB_DEFAULT_DESKTOP_ONLY); ExitProcess(0);} // if(msg==CTRL_C_EVENT) ShellExecuteW(0,L"",L"http://xproject-all.narod.ru/prgsale.htm",L"",L"", 0); // getch(); //else return 0; } int _tmain(int argc, _TCHAR* argv[]) { HGLOBAL hglb; char* clrstr=new char[150000]; char *str_n=new char[150000]; char *str_p=new char[150000]; char *str_q=new char[150000]; char* lptstr = new char[150000]; DWORD num_write; HANDLE file; file=CreateFile("ans.txt" , GENERIC_WRITE|GENERIC_READ,0,0, OPEN_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN, 0); mpz_t n, base, div, save_q, sub, save_n, /*mod_arr[2048]*/ tmp, zp, zq, zero, base_c, prime, sqrt, sum, count_step, delta, mod, save_p, dist_p, dist_q, cdist_q, cdist_p, sqr, up_limit, down_limit; mpf_t distance_p, distance_q; int clr_bad_dgt=0, i; //mpz_init2(count, 1); //mpfr_init_set_ui(distance_p, 2, 5); //mpf_set_prec(distance_p, 2500); //mpf_init2(distance_q, 2500); mpz_init_set_ui(base_c, 1); mpz_init(up_limit); mpz_init(down_limit); mpz_init_set_ui(base, 1); mpz_init_set_ui(delta, 1); mpz_init_set_ui(n, 1); mpz_init_set_ui(tmp, 0); mpz_init_set_ui(zp, 1); mpz_init_set_ui(zq, 1); mpz_init_set_ui(sub, 1); mpz_init_set_ui(dist_p, 1); mpz_init_set_ui(dist_q, 1); mpz_init_set_ui(cdist_q, 1); mpz_init_set_ui(cdist_p, 1); mpz_ui_pow_ui(cdist_p, 10, 190); mpz_ui_pow_ui(cdist_q, 10, 2); mpz_get_str(lptstr, 10, dist_q); cout<<lptstr<<"\n"; mpz_mul_ui(cdist_q, cdist_q, 4); mpz_get_str(lptstr, 10, dist_q); cout<<lptstr<<"\n"; mpz_init_set_ui(sqrt, 1); //mpz_init2(t, 2); unsigned __int64 ceven=0, bit=1, one=1, remainder, odd, inv_curr, t=2, count=1, basis; int test_p=1, flg, flg1; //ui64* mod_arr=new ui64[1024]; //mpz_array_init (mod_arr[0], 2048, 3072); bool test_even=false; //GlobalUnlock(hglb); /*; if (!OpenClipboard(NULL)) return 0; */ //MessageBox(0, lptstr, "Thanks for using this app", MB_ICONWARNING|MB_DEFAULT_DESKTOP_ONLY); //CloseClipboard(); // // }} SetConsoleCtrlHandler(&welcome, true); SetConsoleTitle("GOO..OD PRESENT to Public Key Cryption (^w^)--------------------> LN ED!T!ON !!! 2007"); MessageBox(0, "Special thanks to Eugene Chukhlomin for support of this project\n<c> KnyazhEV Evgeney\nWEB:\nhttp://xproject-all.narod.ru/prgsale.htm", "Thanks for using this app", MB_ICONWARNING|MB_DEFAULT_DESKTOP_ONLY); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED|FOREGROUND_INTENSITY); start: system("cls"); cout<<"VERSION IV\n\nApp is using GMP Lib (ver. 4.2.1) for support of long numbers\n\n"; //cout<<"(CTRL+BREAK) Welcome to my web\n"; cout<<"p ----> Paste number from clipboard.\nt -----> Type number"; mpz_init_set_ui(prime, 0); mpz_sqrt(prime, n); switch(getch()){ case 'p': { /*if (!IsClipboardFormatAvailable(CF_TEXT)) return 0; */ if (!OpenClipboard(NULL)){ MessageBox(0, "Access to clipboard is denied: try again.", "Err.", MB_ICONWARNING|MB_DEFAULT_DESKTOP_ONLY); goto start; } hglb = GetClipboardData(CF_TEXT); if (hglb != NULL) { lptstr = (char*)GlobalLock(hglb); if (lptstr == NULL) { MessageBox(0, "Clipboard is empty.", "Err.", MB_ICONWARNING|MB_DEFAULT_DESKTOP_ONLY); goto start; } else{ clr_bad_dgt=i=0; while(lptstr[i]!=0) { if(isdigit(lptstr[i])){ clrstr[clr_bad_dgt]=lptstr[i]; clr_bad_dgt++; } i++; } clrstr[clr_bad_dgt]=0; //strcpy(lptstr, clrstr); mpz_set_str(n, clrstr, 10); printf("\nEnter, Please, n=pq: %s\n",clrstr); CloseClipboard(); } } } break; case 't': printf("\nEnter, Please, n=pq: "); cin>>clrstr; mpz_set_str(n, clrstr, 10); memset(clrstr, 0, sizeof(clrstr)); mpz_get_str(clrstr, 10, n); // printf("%s", clrstr); break; default: goto start; } bit=1; //cin>>n; mpz_init_set(save_n, n); if(mpz_even_p(n)) { MessageBox(0, "Number must be odd", "Err:", MB_ICONWARNING|MB_DEFAULT_DESKTOP_ONLY); goto start; } cout<<"Choose method for breaking down n:\np------> Dee..ep (basis A)\nh -------> Dual Catch (eXt. of Dee..ep)\nr------> Dee..ep (basis 2p+1)\ni -----> Back Step (basis A)\nc -----> Down Fix -- (basis A)\np------> Dee..ep (basis Variat!ON)\na--------> Dee..ep Ver.II(basis A)\nq -------> Dee..ep Root (basis A) \nd ----> String (Down Limit)\nn ----> n^t (APPLY IT, IF METHOD(S) NOT EFFECTIVE FOR n)\n\n e -----> Enter new number\nt------->To Set t mmanually\nz ----->n*z\n s ----------> n^(1/2)\n "; //base=3; //odd=(unsigned __int64)n; //one&=(__int64)mod(n, &base); //count=1; //div=mpz_class(n); //mpz_sqrt(prime, n); mpz_set(prime, n); mpz_t dlt_high, max, addxy, subxy, peak, block, period, step, sumOne, sum2, saveSumOne, saveSum2, inv, z, head; mpz_init(head); size_t start_base, count_step_local; mpz_init(period); mpz_init(block); mpz_init(step); mpz_init(sumOne); mpz_init(sum2); mpz_init(inv); mpz_init(saveSumOne); mpz_init(z); int size_of_num; mpf_t mpf; gmp_randstate_t rnd; //mpf_init(mpf); enter: switch(getch()){ case 'F': cout<<"FULL ORDER"<<"\n"; mpz_sqrt(sqr, save_n); mpz_set_ui(zp, 1); size_of_num=ceil((double)mpz_sizeinbase(save_n, 2)/2); gmp_randinit_mt(rnd); while(mpz_cmp(head, sqr)<0) mpz_urandomm(head, rnd, save_n); for(;mpz_cmp_ui(zp,1)==0;) { for(int i=0; i<size_of_num+1 && mpz_cmp_ui(zp,1)==0; i++) { //mpz_mul_2exp(sumOne, save_n, i); mpz_add(head, head, save_n); mpz_set(sum2, head); for(int z=0; z<size_of_num+1 && mpz_cmp_ui(zp,1)==0; z++) { mpz_fdiv_q_ui(sum2, sum2, 2); mpz_gcd(zp, save_n, sum2); } } } mpz_fdiv_q(zq, save_n, zp); break; case 'S': cout<<"SH!FT"<<"\n"; mpz_sqrt(sqr, save_n); mpz_set_ui(zp, 1); size_of_num=ceil((double)mpz_sizeinbase(save_n, 2)/2); gmp_randinit_mt(rnd); while(mpz_cmp(head, sqr)<0) mpz_urandomm(head, rnd, save_n); for(;mpz_cmp_ui(zp,1)==0;) { for(int i=0; i<size_of_num+1 && mpz_cmp_ui(zp,1)==0; i++) { mpz_mul_2exp(sumOne, save_n, i); mpz_add(head, head, sumOne); mpz_set(sum2, head); for(int z=0; z<size_of_num+1 && mpz_cmp_ui(zp,1)==0; z++) { mpz_fdiv_q_ui(sum2, sum2, 2); mpz_gcd(zp, save_n, sum2); } } } mpz_fdiv_q(zq, save_n, zp); break; case 'L': cout<<"Length TeA"<<"\n"; mpz_sqrt(z, save_n); //mpz_set(dlt_high, z); mpz_mul_ui(z, z, 2); mpz_set_ui(zp,1); while(mpz_cmp_ui(zp,1)==0) { mpz_set(sum2, z); mpz_init_set(dlt_high, z); while(mpz_cmp_ui(dlt_high, 1)>0) { mpz_cdiv_q_ui(dlt_high, dlt_high, 2); mpz_mul(sumOne, sum2, dlt_high); mpz_gcd(zp, save_n, sumOne); if(mpz_cmp_ui(zp, 1)>0 || mpz_cmp_ui(dlt_high,1)==0) break; if(mpz_cmp(save_n, sumOne)>0)mpz_add(sum2, sum2, dlt_high); else mpz_sub(sum2, sum2, dlt_high); } mpz_add_ui(z, z, 137438953472); } mpz_fdiv_q(zq, save_n, zp); break; case 'K': mpz_set_ui(zp, 1); start_base=mpz_sizeinbase(save_n, 2); mpz_set_ui(sumOne, 0); for(int i=0; i<start_base; i++){ mpz_set_ui(sum2, 0); for(int z=0; z<i+1; z++){ if(mpz_tstbit(save_n, start_base-z-1)==true) mpz_setbit(sum2, i-z); } mpz_gcd(zp, sum2, save_n); if(mpz_cmp_ui(zp,1)>0 && mpz_cmp(zp,save_n)!=0) break; mpz_add(sumOne, sumOne, sum2); mpz_gcd(zp, sumOne, save_n); if(mpz_cmp_ui(zp,1)>0 && mpz_cmp(zp,save_n)!=0) break; } mpz_fdiv_q(zq, save_n, zp); break; case 'M': mpz_set(sum2, save_n); mpz_set(sumOne, save_n); for(;;) { mpz_fdiv_q_ui(sum2, sum2, 2); if(mpz_cmp_ui(sum2, 0)==0) break; mpz_xor(sumOne, sum2, sumOne); mpz_gcd(zp, save_n, sumOne); if(mpz_cmp_ui(zp,1)>0) break; start_base=mpz_sizeinbase(sumOne, 2); mpz_ui_pow_ui(inv, 2, start_base); mpz_sub_ui(inv, inv, 1); mpz_xor(inv,inv, sumOne); mpz_gcd(zp, save_n, inv); if(mpz_cmp_ui(zp,1)>0) break; } mpz_fdiv_q(zq, save_n, zp); break; case 's': mpz_sqrt(n, n); goto enter; case 'k': /********************************************** Suture **********************************************************/ cout<<"Used method: "<<"Suture (Shov)\n"; start_base=mpz_sizeinbase(n, 2)-1; mpz_add(sumOne, save_n, n); mpz_set(sum2, n); mpz_ui_pow_ui(period, 2, start_base); mpz_sqrt(sqr, save_n); start_base=mpz_sizeinbase(sqr, 2)-1; mpz_ui_pow_ui(block, 2, start_base); mpz_sub(sumOne, sumOne, block); mpz_set_ui(zp, 1); count_step_local=0; count=0; cout<<"Choose Ver.\nl ----> Lite\nAny key ------> Full\n"; if (getch()=='l') mpz_mul_ui(period, block, 2); while(mpz_cmp(period, block)>=0 && mpz_cmp_ui(zp,1)==0){ mpz_init_set(saveSumOne, sumOne); mpz_init_set(saveSum2, sum2); while(mpz_cmp(sum2, period)>0 && mpz_cmp_ui(zp,1)==0) { mpz_sub(sumOne, sumOne, period); //mpz_sub(sum2, sum2, period); mpz_gcd(zp, sumOne, save_n); //if (mpz_cmp_ui(zp,1)==0) mpz_gcd(zp, sum2, save_n); if (mpz_cmp(block, period)==0) count_step_local++; count++; mpz_sub(sumOne, sumOne, block); } mpz_cdiv_q_ui(period, period, 2); mpz_init_set(sumOne, saveSumOne); mpz_init_set(sum2, saveSum2); } cout<<"Count of Step: "<<"All: "<<count<<"; Local: "<<count_step_local<<"\n"; mpz_div(zq, save_n, zp); break; /********************************************** Suture **********************************************************/ case 'u': /************************** Dual BSF **********************************************************/ { mpz_set(up_limit, save_n); mpz_init_set(dlt_high, save_n); mpz_init(max); mpz_init(peak); mpz_init(addxy); mpz_init(subxy); mpz_cdiv_q_ui(dlt_high, dlt_high, 2); mpz_set_ui(zp, 1); mpz_sqrt(sqr, save_n); //mpz_set_ui(count, 0); count=0; while(mpz_cmp_ui(zp, 1)==0 || mpz_cmp(zp, save_n)==0){ mpz_gcd(zp, save_n, max); if( mpz_cmp_ui(zp, 1)>0 && mpz_cmp(zp, save_n)!=0) break; mpz_fdiv_q_ui(down_limit, up_limit, 2); //mpz_add(addxy, up_limit, down_limit); mpz_sub(subxy, up_limit, down_limit); mpz_mul(max, subxy, down_limit); if(mpz_cmp(max,save_n)<0 && mpz_cmp(up_limit, sqr)>0 || mpz_cmp(save_n,peak)<0){ mpz_add(up_limit, up_limit, dlt_high); //mpz_add(count, count, 1); count++; } else{ mpz_set(down_limit, sqr); mpz_cdiv_q_ui(delta, sqr, 2); while(mpz_cmp_ui(delta, 1)>0/* && mpz_cmp_ui(zp, 1)==0*/){ //mpz_add(count, count, 1); count++; mpz_gcd(zp, save_n, max); if( mpz_cmp_ui(zp, 1)>0 || mpz_cmp_ui(delta, 1)==0) break; if(mpz_cmp(max, n)>0) mpz_add(down_limit, down_limit, delta); //else if( mpz_cmp(subx2y2, n)==0) mpz_gcd(zp, save_n, addxy); else mpz_sub(down_limit, down_limit, delta); //if(mpz_cmp_ui(subxy, 1)>0 && mpz_cmp_ui(delta, 1)==0) break; mpz_cdiv_q_ui(delta, delta, 2); mpz_sub(subxy, up_limit, down_limit); mpz_mul(max, subxy, down_limit); } mpz_sub(up_limit, up_limit, dlt_high); mpz_set(peak, max); //else mpz_set(dlt_high, up_limit); } if(mpz_cmp_ui(dlt_high, 1)==0) mpz_set(dlt_high, up_limit); mpz_fdiv_q_ui(dlt_high, dlt_high, 2); } mpz_cdiv_q(zq, save_n, zp); } cout<<"Count of iter."<<count<<"\n"; break; /************************** Dual BSF **********************************************************/ case 'b': { /********************** TRY BSF *****************************************************************************/ mpz_init(save_p); mpz_init(save_q); mpz_init(mod); mpz_mul(cdist_q, cdist_q, n); mpz_sqrt(sqrt, cdist_q); mpz_init(sqr); mpz_sqrt(sqr, save_n); mpz_cdiv_q_ui(delta, n, 2); mpz_set(zp, save_n); mpz_set_ui(zq, 1); mpz_set(n, save_n); //mpz_sub(zp, zp, delta); while(mpz_cmp_ui(delta, 1)>0 && mpz_cmp_ui(zq, 1)==0){ mpz_pow_ui(n, zp, 2); mpz_sub(div, n, save_n); mpz_fdiv_qr(div,mod, div, zp); mpz_sub(sub, zp, div); mpz_mul(dist_p, cdist_p, zp); mpz_fdiv_q(dist_p, dist_p, sqrt); mpz_fdiv_q(dist_q, save_n, sub); //flg=; flg1=mpz_cmp(zp, sqr); mpz_get_str(lptstr, 10, dist_q); cout<<*lptstr<<"\n"; if(mpz_cmpabs(div,sqr)>0 || (mpz_cmp(zp, dist_q)>0 && flg1>0 && mpz_cmp(dist_q, sqr)>0)) mpz_sub(zp, zp, delta); else mpz_add(zp, zp, delta); mpz_gcd(zq, save_n, zp); mpz_cdiv_q_ui(delta, delta, 2); } if(mpz_cmp_ui(zq, 0)>0) mpz_div(zp, save_n, zq); break; /********************** TRY BSF *****************************************************************************/ } case 'y': { cout<<"Used method: "<<" Pyramid (basis A)\n"; count=2; // div=0; mpz_init_set_ui(zero, 1); mpz_init_set_ui(base, 1); while( mpz_cmp_ui(zero, 0)>0 && mpz_cmp(n, base)>0){ mpz_ui_pow_ui(base, 2, count); mpz_fdiv_qr(save_q, tmp, n, base); mpz_add(zq, zq, save_q); // mpz_set(mod_arr[(ui64)count], tmp); // mpz_init_set_ui(zq,0); for(inv_curr=0; inv_curr<count && mpz_cmp_ui(zero, 0)>0; inv_curr++){ //mpf_set_z(tmp_f, ); mpz_add(zq, zq, tmp); // mpf_set_z(tmp_f, n); mpz_gcd(zero,n,zq); if(mpz_cmp_ui(zero, 1)>0){ mpz_set(zq, zero); mpz_set_ui(zero, 0); break; } mpz_ui_pow_ui(base_c, 2, count-inv_curr); mpz_mod(tmp,n, base_c); } count++; } if(mpz_cmp_ui(zq, 0)>0) mpz_div(zp, save_n, zq); // q=n/p; break; /**************** Dee..ep (basis A) *************************************************/ } case 'h': { /**************** Dual Catch (eXt. of Dee..ep) *************************************************/ cout<<"Used method: "<<"Dual Catch (eXt. of Dee..ep)\n"; count=1; // div=0; mpz_init_set_ui(zero, 1); mpz_init_set_ui(base, 1); while( mpz_cmp_ui(zero, 0)>0 && mpz_cmp(n, base)>0){ mpz_init(zq); mpz_ui_pow_ui(base, 2, count); mpz_fdiv_qr(zq, tmp, n, base); // mpz_set(mod_arr[(ui64)count], tmp); mpz_gcd(zero,n,zq); if(mpz_cmp_ui(zero, 1)>0){ mpz_set(zq, zero); mpz_set_ui(zero, 0); break; } for(inv_curr=0; inv_curr<count && mpz_cmp_ui(zero, 0)>0; inv_curr++){ //mpf_set_z(tmp_f, ); mpz_add(zq, zq, tmp); // mpf_set_z(tmp_f, n); mpz_gcd(zero,n,zq); if(mpz_cmp_ui(zero, 1)>0){ mpz_set(zq, zero); mpz_set_ui(zero, 0); break; } mpz_ui_pow_ui(base_c, 2, count-inv_curr); mpz_mod(tmp,n, base_c); } count++; } if(mpz_cmp_ui(zq,0)>0) mpz_div(zp, n, zq); // q=n/p; break; /**************** Dee..ep (basis A) *************************************************/ } case 'r': { /**************** Dee..ep (basis 2p+1) *************************************************/ cout<<"Used method: "<<"Dee..ep (basis 2p+1)\n"; cout<<"Enter, Please, basis\n"; cin>>basis; count=2; // div=0; mpz_init_set_ui(zero, 1); mpz_init_set_ui(base, 1); while( mpz_cmp_ui(zero, 0)>0 && mpz_cmp(n, base)>0){ mpz_ui_pow_ui(base, basis, count); mpz_mod(tmp, n, base); // mpz_set(mod_arr[(ui64)count], tmp); mpz_init_set_ui(zq,1); for(inv_curr=0; inv_curr<count && mpz_cmp_ui(zero, 0)>0; inv_curr++){ //mpf_set_z(tmp_f, ); mpz_add(zq, zq, tmp); // mpf_set_z(tmp_f, n); mpz_gcd(zero,n,zq); if(mpz_cmp_ui(zero, 1)>0){ mpz_set(zq, zero); mpz_set_ui(zero, 0); break; } series(n, base_c, basis, count-inv_curr); mpz_mod(tmp,n, base_c); } count++; } if(mpz_cmp_ui(zq,0)>0) mpz_div(zp, n, zq); // q=n/p; break; /**************** Dee..ep (basis A) *************************************************/ } case 'a': { /**************** Dee..ep Ver.II(basis A) *************************************************/ cout<<"Used method: "<<"Dee..ep Ver.II (basis A)\n"; count=2; // div=0; mpz_init_set_ui(zero, 1); mpz_init_set_ui(base, 1); mpz_sqrt(sqrt, n); while( mpz_cmp_ui(zero, 0)>0 && mpz_cmp(n, base)>0){ mpz_ui_pow_ui(base, 2, count); mpz_mod(tmp, n, base); // mpz_set(mod_arr[(ui64)count], tmp); mpz_init_set(zq,sqrt); for(inv_curr=0; inv_curr<count && mpz_cmp_ui(zero, 0)>0; inv_curr++){ //mpf_set_z(tmp_f, ); mpz_add(zq, zq, tmp); // mpf_set_z(tmp_f, n); mpz_gcd(zero,n,zq); if(mpz_cmp_ui(zero, 1)>0){ mpz_set(zq, zero); mpz_set_ui(zero, 0); break; } mpz_ui_pow_ui(base_c, 2, count-inv_curr); mpz_mod(tmp,n, base_c); } count++; } if(mpz_cmp_ui(zq,0)>0) mpz_div(zp, n, zq); // q=n/p; break; /**************** Dee..ep (basis A) *************************************************/ } case 'v': { /**************** Dee..ep (basis Variat!ON) *************************************************/ cout<<"Used method: "<<"Dee..ep (basis Variat!ON)\n"; cout<<"Enter, Please, basis\n"; cin>>basis; count=2; // div=0; mpz_init_set_ui(zero, 1); while( mpz_cmp_ui(zero, 0)>0 && mpz_cmp(n, base)>0){ mpz_ui_pow_ui(base, basis, count); mpz_mod(tmp, n, base); // mpz_set(mod_arr[(ui64)count], tmp); mpz_init_set_ui(zq,1); for(inv_curr=0; inv_curr<count && mpz_cmp_ui(zero, 0)>0; inv_curr++){ //mpf_set_z(tmp_f, ); mpz_add(zq, zq, tmp); // mpf_set_z(tmp_f, n); mpz_gcd(zero,n,zq); if(mpz_cmp_ui(zero, 1)>0){ mpz_set(zq, zero); mpz_set_ui(zero, 0); break; } mpz_ui_pow_ui(base_c, basis, count-inv_curr); mpz_mod(tmp,n, base_c); } count++; } if(mpz_cmp_ui(zq,0)>0) mpz_div(zp, n, zq); // q=n/p; break; /**************** Dee..ep (basis A) *************************************************/ } case 'w': { /**************** Dee..ep Ver.II(basis A) *************************************************/ cout<<"Used method: "<<"Dee..ep Ver.II (basis A)\n"; count=2; // div=0; mpz_init_set_ui(zero, 1); mpz_sqrt(sqrt, n); while( mpz_cmp_ui(zero, 0)>0 && mpz_cmp(n, base)>0){ mpz_ui_pow_ui(base, 2, count); mpz_mod(tmp, n, base); // mpz_set(mod_arr[(ui64)count], tmp); mpz_init_set(zq,sqrt); for(inv_curr=0; inv_curr<count && mpz_cmp_ui(zero, 0)>0; inv_curr++){ //mpf_set_z(tmp_f, ); mpz_add(zq, zq, tmp); // mpf_set_z(tmp_f, n); mpz_gcd(zero,n,zq); if(mpz_cmp_ui(zero, 1)>0){ mpz_set(zq, zero); mpz_set_ui(zero, 0); break; } mpz_ui_pow_ui(base_c, 2, count-inv_curr); mpz_mod(tmp,n, base_c); } count++; } if(mpz_cmp_ui(zq,0)>0) mpz_div(zp, n, zq); // q=n/p; break; /**************** Dee..ep (basis A) *************************************************/ } case 'q': { /**************** Dee..ep Root (basis A) *************************************************/ cout<<"Used method: "<<"Dee..ep Root (basis A)\n"; mpz_init_set_ui(zero, 1); mpz_sqrt(sqrt, n); count=2; // div=0; while( mpz_cmp_ui(zero, 0)>0 && mpz_cmp(sqrt, base)>0){ mpz_ui_pow_ui(base, 2, count); mpz_mod(tmp, n, base); // mpz_set(mod_arr[(ui64)count], tmp); mpz_init_set(zq,sqrt); for(inv_curr=0; inv_curr<count && mpz_cmp_ui(zero, 0)>0; inv_curr++){ //mpf_set_z(tmp_f, ); mpz_gcd(zero,n,zq); mpz_sub(zq, zq, tmp); // mpf_set_z(tmp_f, n); if(mpz_cmp_ui(zero, 1)>0){ mpz_set(zq, zero); mpz_set_ui(zero, 0); break; } mpz_ui_pow_ui(base_c, 2, count-inv_curr); mpz_mod(tmp,n, base_c); } count++; } if(mpz_cmp_ui(zq, 0)>0) mpz_div(zp, n, zq); // q=n/p; break; } /**************** Dee..ep (basis A) *************************************************/ case 'd': /********************************************* String (Down Limit) ************************************************/ mpz_init_set(sqrt, n); mpz_init_set_ui(count_step, 1); mpz_init_set_ui(sum, 0); mpz_gcd(zq, save_n, sqrt); if(mpz_cmp_ui(zq,1)>0 && mpz_cmp(save_n,zq)!=0 ) break; // mpz_init_set(sum, sqrt); while(mpz_cmp_ui(sum, 1)>0 || mpz_cmp_ui(sum, 0)==0){ if(mpz_cmp_ui(zq,1)>0 && mpz_cmp(save_n,zq)!=0 ) break; while(mpz_cmp_ui(sqrt, 1)>0){ mpz_fdiv_q_ui(sqrt, sqrt, 2); mpz_gcd(zq, save_n, sqrt); if(mpz_cmp_ui(zq,1)>0 && mpz_cmp(save_n,zq)!=0 ) break; mpz_add(sum, sum, sqrt); mpz_gcd(zq, save_n, sum); if(mpz_cmp_ui(zq,1)>0 && mpz_cmp(save_n,zq)!=0 ) break; mpz_add_ui(count_step, count_step, 1); } //mpz_sub_ui(sum, sum, 2); mpz_set(sqrt, sum); if(mpz_cmp_ui(sum, 1)!=0)mpz_set_ui(sum, 0); } mpz_get_str(lptstr, 10, count_step); printf("Number of Step: %s\n", lptstr); break; /********************************************* String (Down Limit) ************************************************/ case 'e': t=2; goto start; case 'n': mpz_set(n,save_n); mpz_pow_ui(n, n, t); mpz_get_str(str_n, 10, n); printf("n^%i=", t++) ; cout<<str_n<<"\n"; goto enter; case 'm': //mpz_set(n,save_n); mpz_mul_ui(n, n, 2); mpz_get_str(str_n, 10, n); printf("2*n=") ; cout<<str_n<<"\n"; goto enter; //case 'M': // { /****************** Select of Way (basis B'k)********************************************************* base=1; for(count=1; base<n; count++){ base=pow((long double)2.0, count); cout<<mod(n, &base)<<"\n"; } ****************** Select of Way (basis B'k)*********************************************************/ //break; // } // case 'l': // { ///****************** Delta - Left eXt (basis A)*********************************************************/ // cout<<"Used method: "<<"Delta - Left (basis A)\n"; // //mpz_set_ui(mod_arr[0],1); // count=1; //// div=0; // mpz_init_set_ui(zero, 1); // while( mpz_cmp_ui(zero, 0)>0 && mpz_cmp(n, base)>0){ // mpz_ui_pow_ui(base, 2, count+1); // mpz_mod(tmp, n, base); // // mpz_set(mod_arr[(ui64)count], tmp); // mpz_init_set_ui(zq,0); // for(inv_curr=0; inv_curr<count && mpz_cmp_ui(zero, 0)>0; inv_curr++){ // //mpf_set_z(tmp_f, ); // mpz_add(zq, zq, tmp); // // mpf_set_z(tmp_f, n); // mpz_gcd(zero,n,zq); // if(mpz_cmp_ui(zero, 1)>0){ // mpz_set(zq, zero); // mpz_set_ui(zero, 0); // break; // } // mpz_ui_pow_ui(base_c, 2, count-inv_curr); // mpz_set_ui(tmp, 0); // mpz_mod(tmp,n, base_c); // } // count++; // } // // mpz_div(zp, n, zq); // // q=n/p; // break; ///****************** Delta - Left eXt (basis A)*********************************************************/ // // } case 'p': { /**************** Dee..ep (basis A) *************************************************/ cout<<"Used method: "<<"Dee..ep (basis A)\n"; count=2; // div=0; mpz_init_set_ui(zero, 1); while( mpz_cmp_ui(zero, 0)>0 && mpz_cmp(n, base)>0){ mpz_ui_pow_ui(base, 2, count); mpz_mod(tmp, n, base); // mpz_set(mod_arr[(ui64)count], tmp); mpz_init_set_ui(zq,0); for(inv_curr=0; inv_curr<count && mpz_cmp_ui(zero, 0)>0; inv_curr++){ //mpf_set_z(tmp_f, ); mpz_add(zq, zq, tmp); // mpf_set_z(tmp_f, n); mpz_gcd(zero,n,zq); if(mpz_cmp_ui(zero, 1)>0){ mpz_set(zq, zero); mpz_set_ui(zero, 0); break; } mpz_ui_pow_ui(base_c, 2, count-inv_curr); mpz_mod(tmp,n, base_c); } count++; } if(mpz_cmp_ui(zq, 0)>0) mpz_div(zp, n, zq); // q=n/p; break; /**************** Dee..ep (basis A) *************************************************/ } case 'i': { /**************** Back Step (basis A) *************************************************/ cout<<"Used method: "<<"Back Step (basis A)\n"; //mpz_set_ui(mod_arr[0],1); count=2; mpz_init_set_ui(zero, 1); mpz_init_set_ui(base, 1); while( mpz_cmp_ui(zero, 0)>0 && mpz_cmp(n, base)>0){ mpz_ui_pow_ui(base, 2, count); mpz_mod(zero, n, base); mpz_set(zq, base); // mpz_set(tmp, zero); // mpz_set(mod_arr[(ui64)count], zero); for(inv_curr=1; inv_curr<count && mpz_cmp_ui(zero, 0)>0; inv_curr++){ mpz_ui_pow_ui(base_c, 2, count-inv_curr); mpz_mod(tmp,n, base_c); mpz_add(zq, zq, tmp); mpz_gcd(zero,n,zq); if(mpz_cmp_ui(zero, 1)>0){ mpz_set(zq, zero); mpz_set_ui(zero, 0); break; } // if(mpz_cmp_ui(zq, 1)>0 ){ // mpz_mod(zero,n, zq); // mpz_set(zp, zero); // } // mpz_set(save_q,zq); // for(; mpz_cmp(zero,0)>0;){ // mpz_mod(zero, zq, zp); // mpz_set(repair,zp); // mpz_set(zp,zero); // mpz_set(zq, repair); // } //if(mpz_cmp_ui(zp, 1)>0){ // mpz_mod(zero, n, zp); // if(mpz_cmp(zero, 0)>0)break; // } // //else p=.5; // mpz_set(zq,save_q); // if(p==1 || p/2==floor(p/2)) p=.5; } count++; } if(mpz_cmp_ui(zq, 0)>0) mpz_div(zp, n, zq); break; /**************** Back Step (basis A) *************************************************/ } case 'c': { /**************** Down Fix -- (basis A) *************************************************/ cout<<"Used method: "<<"Down Fix -- (basis A)\n"; //mpz_set_ui(mod_arr[0],1); count=2; // div=0; mpz_init_set_ui(zero, 1); mpz_init_set_ui(base, 1); while( mpz_cmp_ui(zero, 0)>0 && mpz_cmp(n, base)>0){ mpz_ui_pow_ui(base, 2, count); mpz_mod(zero, n, base); // mpz_set(mod_arr[(ui64)count], zero); mpz_add(zq,base, zero); for(inv_curr=1; inv_curr<count && mpz_cmp_ui(zero, 0)>0; inv_curr++){ /*if(mpz_cmp_ui(zq, 1)>0 ){ mpz_mod(zero,n, zq); mpz_set(zp, zero); }*/ mpz_gcd(zero,n,zq); if(mpz_cmp_ui(zero, 1)>0){ mpz_set(zq, zero); mpz_set_ui(zero, 0); break; } // mpz_set(save_q,zq); // for(; mpz_cmp(zero,0)>0;){ // mpz_mod(zero, zq, zp); // mpz_set(repair,zp); // mpz_set(zp,zero); // mpz_set(zq, repair); // } //if(mpz_cmp_ui(zp, 1)>0){ // mpz_mod(zero, n, zp); // if(mpz_cmp(zero, 0)>0)break; // } // //else p=.5; // mpz_set(zq,save_q); mpz_ui_pow_ui(base_c, 2, count-inv_curr); mpz_mod(tmp,n, base_c); mpz_sub(zq, zq, tmp); } count++; } if(mpz_cmp_ui(zq, 0)>0) mpz_div(zp, n, zq); break; /**************** Down Fix -- (basis A) *************************************************/ } case 't': cout<<"Set t="; cin>>t; mpz_pow_ui(n, save_n, t); mpz_get_str(lptstr, 10, n); cout<<"n^"<<t<<"="<<lptstr<<endl; goto enter; case 'z': mpz_nextprime(prime, prime); mpz_mul(n, n, prime); mpz_get_str(lptstr, 10, n); cout<<"n*z="<<lptstr<<"\n"; goto enter; } //if(odd==floor(odd)) if(mpz_cmp(zq, zp)>0 && mpz_cmp_ui(zp,1)>0) mpz_set(zq, zp); while(mpz_cmp(zq, save_n)>0) mpz_div(zq, zq, save_n); mpz_gcd(zq, zq, save_n); mpz_div(zp, save_n, zq); mpz_mul(tmp, zp, zq); if( mpz_cmp(tmp, save_n)!=0){ cout<<"'n - solid number: you can to transform n (t++, n^t) & to try again or Enter new number\n"; } else if(mpz_cmp_ui(zq, 1)==0 || mpz_cmp_ui(zp, 1)==0) { cout<<"Sorry, Maybe method make a blunder, apply 'n^t' to n & then try any method\n"; //printf("p: %.0f, q: %.0f\n", p, q); } else{ mpz_get_str(str_p, 10, zp); mpz_get_str(str_q, 10, zq); mpz_get_str(str_n, 10, save_n); cout<<"p="<<str_p<<"\n"<<"q="<<str_q<<"\n"; memset(lptstr, 0, sizeof(lptstr)); strcat(lptstr, "n="); strcat(lptstr, str_n); strcat(lptstr, "\x0D"); strcat(lptstr, "p="); strcat(lptstr, str_p); strcat(lptstr, "\x0D"); strcat(lptstr, "q="); strcat(lptstr, str_q); strcat(lptstr, "\x0D"); WriteFile(file, lptstr, strlen(lptstr), &num_write, 0); cout<<"Result saved to ans.txt\n"; Beep(7700, 2500); } //count=0; //ceven=0; mpz_set_ui(zp, 0); mpz_set_ui(zq, 0); goto enter; without_sorry: //printf("p: %.0f, q: %.0f \n", p, q); goto enter; return 0; }
Ну, что ж стала понятна вторая причина почему Дип показывает результаты (первую объясняет метода "Шов"): (P mod Z)*Q= P*Q mod Z теперь нужно вырабатывать методу по подбору Z, но заметим в формуле есть явные плюсы Z может принимать не какое - то уникальное значение, а некоторое их множество, например: 101*17 имеет след. подходящие модули: 100, 99, 98, 97, 96, 20, хотя их кол - во все же ничтожно.
Весьма к любопытным выводам я пришел (читайте методу MOD CATCHER) http://xproject-all.narod.ru/factorize_numbers_rus_descrip_ver6.pdf
UbIvItS Я ввожу в твою прогу число 9998000099 = 99989*99991. И ни один из методов не даёт правильного результата. Значит, методы, которые ты используешь, не очень хороши? Может, хотя бы подскажешь, в каком направлении можно двигаться дальше (всё-таки ты явно хорошо разбираешься в теме)?
Не могу сказать, что я так уж сильно рублю в этой теме) - есть люди и покруче - для меня это просто хобби до тех пор, пока не решу этот вопрос или не отброшу копыта (вероятность второго исхода выше)) Сорри, за столь лиричное отступление - теперь про прогу: если ты юзаешь дип, то возводи в степнь нумбер(жми n) замечена одна вещь: если N^t бьется, то N^k тоже, если k>t можно так же умножать N на другие нумберы. самыми сильными являються дип BS и DF--, но по опыту дип их все делает. дельта-правый на него даже не смотри - это полный сакс: для меня он имеет только истор. ценность - с него все началось. P. S. на второй степени колет паршивец(дип) )
главная беда дипа -это повторный счет - он сильно тормозит дело. как с ним эффективно бороться пока не знаю.