@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.

Reply via email to