@all sorry .. 21 is prime :-) hw can above algo be well implemented to get mpow function...
On 1/18/12, Sourabh Singh <singhsourab...@gmail.com> wrote: > @All > > pow() mod is giving problem... > > found an algo .. is some1 intrested to discuss... > > Example: > Take 3^21 (mod 7) > > 3^2 = 9 = 2(mod 7), > 3^4 = (3^2)^2 = 2^2 = 4(mod 7) > 3^8 = (3^4)^2 = 4^2 = 16 = 2(mod 7) > 3^16 = (3^8)^2 = 2^2 = 4(mod 7) > > So now we have 3^21 = 3^16 * 3^4 * 3 = 4 * 4 * 3 = 48 = 6 (mod 7). > > basically.. we can split the power and take individual a^d%n for each > then multiply to get result.. > > but my question is what if power is prime and big...???? > > > On 1/18/12, Terence <technic....@gmail.com> wrote: >> error in pow. >> as long as n < 2^31, x*x fits into int64_t, since x<n. >> >> On 2012-1-18 20:51, Sourabh Singh wrote: >>> @ Terence >>> >>> I belive nw its giving wrong answer for n>41 onwards >>> due to error's in pow and x*x over flow as u already stated... >>> >>> i guess algo is right nw.. ;-) >>> >>> thanx again.. >>> >>> >>> On 1/18/12, Sourabh Singh<singhsourab...@gmail.com> wrote: >>>> @ thanx got it.. silly mistakes ;-) . missed thought it ws + between s >>>> and >>>> d. >>>> >>>> >>>> //suggested corrections made.. still not working.. >>>> #include<iostream> >>>> #include<conio.h> >>>> #include<math.h> >>>> using namespace std; >>>> int is_prime(int n) >>>> { >>>> if(n==2 | n==3) >>>> return 1; >>>> if(((n-1)%6!=0& (n+1)%6!=0) || n<2) >>>> return 0; >>>> int j,s,d=n-1; while((d&1)==0) d>>=1; >>>> >>>> s=n/d;for(j=0;1<<j<s;j++); s=j; >>>> >>>> int primes[6]={2,3,7,31,61,73},i,a,flag; >>>> uint64_t x; >>>> for(i=0;i<6;i++) >>>> { if(primes[i]>=n) >>>> break; >>>> a=primes[i]; >>>> x=uint64_t(pow(a,d))%n; >>>> if(x==1 || x==n-1) >>>> continue; >>>> int r; >>>> for(r=1;r<s;r++) >>>> { x=(x*x)%n; >>>> if(x==1) >>>> return 0; >>>> if(x==n-1) >>>> break; >>>> } >>>> if(x!=n-1) >>>> return 0; >>>> } >>>> return 1; >>>> } >>>> main() >>>> {for(int k=1;k<2000;k++) >>>> if(is_prime(k)) >>>> printf("%d is %d\n",k,is_prime(k)); >>>> getch(); >>>> } >>>> >>>> >>>> On 1/18/12, Terence<technic....@gmail.com> wrote: >>>>> @Sourabh >>>>> >>>>> m=2^s***d >>>>> primes[i]*<*n >>>>> >>>>> >>>>> >>>>> On 2012-1-18 19:39, Sourabh Singh wrote: >>>>>> @Terrence >>>>>> >>>>>> sry i didn't explain what s,d were they were also wrong i ws >>>>>> calculating for n not n-1 >>>>>> earlier n=2^s+d >>>>>> >>>>>> nw m=n-1; for odd n >>>>>> m=2^s+d; >>>>>> >>>>>> //suggested corrections made.. still not working.. >>>>>> #include<iostream> >>>>>> #include<conio.h> >>>>>> #include<math.h> >>>>>> using namespace std; >>>>>> int is_prime(int n) >>>>>> { >>>>>> if(n==2 | n==3) >>>>>> return 1; >>>>>> if(((n-1)%6!=0& (n+1)%6!=0) || n<2) >>>>>> return 0; >>>>>> int m=n-1; >>>>>> int s,d; >>>>>> for(s=0;1<<s<m;++s); s--;d=(m%(1<<s)); >>>>>> >>>>>> int primes[6]={2,3,7,31,61,73},i,a,flag; >>>>>> uint64_t x; >>>>>> for(i=0;i<6;i++) >>>>>> { if(primes[i]>n) >>>>>> break; >>>>>> a=primes[i]; >>>>>> x=uint64_t(pow(a,d))%n; >>>>>> if(x==1 || x==n-1) >>>>>> continue; >>>>>> >>>>>> for(int r=1;r<s;r++) >>>>>> { x=(x*x)%n; >>>>>> if(x==1) >>>>>> return 0; >>>>>> if(x==n-1) >>>>>> break; >>>>>> } >>>>>> if(x!=n-1) >>>>>> return 0; >>>>>> } >>>>>> return 1; >>>>>> } >>>>>> main() >>>>>> {for(int k=1;k<20;k++) printf("%d is %d\n",k,is_prime(k)); getch();} >>>>>> >>>>>> >>>>>> On 1/18/12, Sourabh Singh<singhsourab...@gmail.com> wrote: >>>>>>> @ sunny agrawal >>>>>>> >>>>>>> you are right. but i have used check a>n also . no improvement . >>>>>>> i think algo is wrong in later part.. somewhere.. >>>>>>> >>>>>>> @ Terence >>>>>>> >>>>>>> 1) pow may not work for big n but , m just checking for n=1..200 >>>>>>> just to check wether algo is right.. and it's not working even >>>>>>> for >>>>>>> n=7,19... >>>>>>> >>>>>>> 2) d,s are also coming fine for small values.. of n >>>>>>> >>>>>>> 3) for x i have used... 64bit integer.. uint64_t in it's >>>>>>> declaration. >>>>>>> >>>>>>> i just want to get algo right first then bother about big n ;-) >>>>>>> >>>>>>> On 1/18/12, Terence<technic....@gmail.com> wrote: >>>>>>>> 1. the computing of d is incorrect. >>>>>>>> d = n-1; >>>>>>>> while((d&1)==0) d>>=1; >>>>>>>> >>>>>>>> 2. the accuracy of pow is far from enough. you should implement >>>>>>>> your >>>>>>>> own >>>>>>>> pow-modulo-n method. >>>>>>>> >>>>>>>> 3. for big n, (exceed 32bit), x=(x*x)%n can be overflow also. you >>>>>>>> may >>>>>>>> need to implement your own multiply method in this case. >>>>>>>> >>>>>>>> >>>>>>>> On 2012-1-18 18:15, Sourabh Singh wrote: >>>>>>>>> @all output's to above code are just random.. some prime's. found >>>>>>>>> correctly while some are not >>>>>>>>> >>>>>>>>> why i used certain primes to check ie.(2,3,31,73,61,7) coz.. its >>>>>>>>> given >>>>>>>>> n wiki for about 10^15 checking with these is enough.. >>>>>>>>> >>>>>>>>> On 1/18/12, Sourabh Singh<singhsourab...@gmail.com> wrote: >>>>>>>>>> @ALL hi everyone m trying to make prime checker based on >>>>>>>>>> miller-rabin >>>>>>>>>> test . can some1 point out . wat's wrong with the code. thank's >>>>>>>>>> alot >>>>>>>>>> in advance... >>>>>>>>>> >>>>>>>>>> //prime checker based on miller-rabin test >>>>>>>>>> #include<iostream> >>>>>>>>>> #include<conio.h> >>>>>>>>>> #include<math.h> >>>>>>>>>> int is_prime(int n) >>>>>>>>>> { >>>>>>>>>> if(n==2 | n==3) >>>>>>>>>> return 1; >>>>>>>>>> if(((n-1)%6!=0& (n+1)%6!=0) || n<2) >>>>>>>>>> return 0; >>>>>>>>>> int s,d; >>>>>>>>>> for(s=0;1<<s<n;++s); s--;d=(n%(1<<s)); >>>>>>>>>> >>>>>>>>>> int primes[6]={2,3,7,31,61,73},i,a,flag; >>>>>>>>>> uint64_t x; >>>>>>>>>> for(i=0;i<6;i++) >>>>>>>>>> { flag=0; >>>>>>>>>> >>>>>>>>>> a=primes[i]; >>>>>>>>>> x=uint64_t(pow(a,d))%n; >>>>>>>>>> if(x==1 | x==n-1) >>>>>>>>>> continue; >>>>>>>>>> for(int r=1;r<s;r++) >>>>>>>>>> { x=(x*x)%n; >>>>>>>>>> printf("x is %llu\n",x); >>>>>>>>>> if(x==1) >>>>>>>>>> return 0; >>>>>>>>>> else >>>>>>>>>> flag=1; >>>>>>>>>> } >>>>>>>>>> if(flag) >>>>>>>>>> continue; >>>>>>>>>> return 0; >>>>>>>>>> } >>>>>>>>>> return 1; >>>>>>>>>> } >>>>>>>>>> main() >>>>>>>>>> { >>>>>>>>>> for(int k=1;k<100;k++) >>>>>>>>>> { >>>>>>>>>> printf("%d is %d\n",k,is_prime(k)); >>>>>>>>>> } >>>>>>>>>> getch(); >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> You received this message because you are subscribed to the >>>>>>>>>> Google >>>>>>>>>> Groups >>>>>>>>>> "Algorithm Geeks" group. >>>>>>>>>> To post to this group, send email to algogeeks@googlegroups.com. >>>>>>>>>> To unsubscribe from this group, send email to >>>>>>>>>> algogeeks+unsubscr...@googlegroups.com. >>>>>>>>>> For more options, visit this group at >>>>>>>>>> http://groups.google.com/group/algogeeks?hl=en. >>>>>>>>>> >>>>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups >>>>>>>> "Algorithm Geeks" group. >>>>>>>> To post to this group, send email to algogeeks@googlegroups.com. >>>>>>>> To unsubscribe from this group, send email to >>>>>>>> algogeeks+unsubscr...@googlegroups.com. >>>>>>>> For more options, visit this group at >>>>>>>> http://groups.google.com/group/algogeeks?hl=en. >>>>>>>> >>>>>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups >>>>> "Algorithm Geeks" group. >>>>> To post to this group, send email to algogeeks@googlegroups.com. >>>>> To unsubscribe from this group, send email to >>>>> algogeeks+unsubscr...@googlegroups.com. >>>>> For more options, visit this group at >>>>> http://groups.google.com/group/algogeeks?hl=en. >>>>> >>>>> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Algorithm Geeks" group. >> To post to this group, send email to algogeeks@googlegroups.com. >> To unsubscribe from this group, send email to >> algogeeks+unsubscr...@googlegroups.com. >> For more options, visit this group at >> http://groups.google.com/group/algogeeks?hl=en. >> >> > -- You received this message because you are subscribed to the Google Groups "Algorithm Geeks" group. To post to this group, send email to algogeeks@googlegroups.com. To unsubscribe from this group, send email to algogeeks+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/algogeeks?hl=en.