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

Reply via email to