Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:hahahahah

Posted by xiedi at 2005-07-01 21:05:53 on Problem 2447
In Reply To:hahahahah Posted by:uni at 2005-07-01 21:04:48
──── inkfish (Fri Sep  3 12:01:40 2004)   ────────────


【 在 kinfkong (  此ID已killed  ) 的大作中提到: 】
: 1. 计算星期几的公式:
:   是不是这样子啊:((13*M-1)/5+D+Y/4+Y+C/4-2*C)%7
:   忘了在哪里抄来的,试了试,怎么不行的?
《初等数论》后面附录有

: 2. 如果用Rabbin的素数速试,如何避过Carmicheal number
:   的干扰? 
: thx


──── iamcs (Fri Sep  3 12:37:30 2004)   ─────────────


【 在 kinfkong (  此ID已killed  ) 的大作中提到: 】
: 1. 计算星期几的公式:
:   是不是这样子啊:((13*M-1)/5+D+Y/4+Y+C/4-2*C)%7
:   忘了在哪里抄来的,试了试,怎么不行的?
 2. 如果用Rabbin的素数速试,如何避过Carmicheal number
   的干扰? 
  
   把那些数记下来,反正很少。
: thx


──── iamcs (Fri Sep  3 12:52:52 2004)   ─────────────

这几个 
561,41041,825265,321197185

【 在 kinfkong (  此ID已killed  ) 的大作中提到: 】
:  给我一个list,我google到的都是比较小的。
: 【 在 iamcs (Savior) 的大作中提到: 】
: :  2. 如果用Rabbin的素数速试,如何避过Carmicheal number
: :    的干扰? 
: :    把那些数记下来,反正很少。


──── iamcs (Mon Sep  6 21:03:32 2004)   ─────────────

谁贴个Rabbin-Miller和 Pollard分解的代码吧

【 在 kinfkong (  此ID已killed  ) 的大作中提到: 】
: 1. 计算星期几的公式:
:   是不是这样子啊:((13*M-1)/5+D+Y/4+Y+C/4-2*C)%7
:   忘了在哪里抄来的,试了试,怎么不行的?
: 2. 如果用Rabbin的素数速试,如何避过Carmicheal number
:   的干扰? 
: thx


──── magicpig (Mon Sep  6 22:04:21 2004)  ────────────

我贴一个吧,请指教。
(以下程序只能平方不超过__int64的情况下应用,对大数据要定义大数运算)
                  -----------输入的n,满足n*n<=2^63
//////////////////////////////////////////////////////
#define MAX 100
__int64 random(){
        __int64 a;
        a = rand();
        a *= rand();
        a *= rand();
        return a;
}
//////////////////////////////////////////////////////
//Miller_Rabin
__int64 square_multiply(__int64 x, __int64 c, __int64 n){
        __int64 z;
        z = 1;
        while(c){
                if(c%2==1)z = (z*x)%n;
                x = (x*x)%n;
                c=(c>>1);
        }
        return z;
}
bool Miller_Rabin(__int64 n){
        __int64 k = 0, i, j, m, a;
        m = n - 1;
        while(m%2==0)m=(m>>1),k++;
        for(i=0;i<MAX;i++){
                a = 0;
                while(a==0)a  = random()%n;
                a = square_multiply(a, m, n);//平方乘
                if(a==1)continue;
                for(j=0;j<k;j++){
                        if(a==n-1)break;
                        a = (a*a)%n;
                }
                if(j<k)continue;
                return false ;
        }
        return true;
}
/////////////////////////////////////////////////////////
//Pollard p,只找出一个因子。
__int64 gcd(__int64 a,__int64 b){
        if(a%b==0)return b;
        else return gcd(b,a%b);
}
//用公式f(x) = x^2 + 1检验碰撞。
__int64 f(__int64 x){
        return x*x+1;
}
__int64 Pollard(__int64 n){
        __int64 i,  p, x,xx;
        for(i=1;i<MAX;i++){
                x = i;
                xx = f(x)%n;
                p = gcd((xx-x+n)%n,n);
                while(p==1){
                        x = f(x)%n;
                        xx = f( f(xx)%n )%n;
                        p = gcd( (xx-x+n)%n,n)%n;
                }
                if(p==0)continue ;
                else return p;
        }
        return -1;
}

【 在 iamcs (Savior) 的大作中提到: 】
: 谁贴个Rabbin-Miller和 Pollard分解的代码吧
: 【 在 kinfkong (  此ID已killed  ) 的大作中提到: 】
: : 1. 计算星期几的公式:
: :   是不是这样子啊:((13*M-1)/5+D+Y/4+Y+C/4-2*C)%7
: :   忘了在哪里抄来的,试了试,怎么不行的?
: : 2. 如果用Rabbin的素数速试,如何避过Carmicheal number
: :   的干扰? 
: : thx


──── magicpig (Mon Sep  6 22:06:09 2004)  ────────────

补充一个主函数,完整代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
__int64 random(){
        __int64 a;
        a = rand();
        a *= rand();
        a *= rand();
        return a;
}
//////////////////////////////////////////////////////
//Miller_Rabin
__int64 square_multiply(__int64 x, __int64 c, __int64 n){
        __int64 z;
        z = 1;
        while(c){
                if(c%2==1)z = (z*x)%n;
                x = (x*x)%n;
                c=(c>>1);
        }
        return z;
}
bool Miller_Rabin(__int64 n){
        __int64 k = 0, i, j, m, a;
        m = n - 1;
        while(m%2==0)m=(m>>1),k++;
        for(i=0;i<MAX;i++){
                a = 0;
                while(a==0)a  = random()%n;
                a = square_multiply(a, m, n);//平方乘
                if(a==1)continue;
                for(j=0;j<k;j++){
                        if(a==n-1)break;
                        a = (a*a)%n;
                }
                if(j<k)continue;
                return false ;
        }
        return true;
}
/////////////////////////////////////////////////////////
//Pollard p,只找出一个因子。
__int64 gcd(__int64 a,__int64 b){
        if(a%b==0)return b;
        else return gcd(b,a%b);
}
//用公式f(x) = x^2 + 1检验碰撞。
__int64 f(__int64 x){
        return x*x+1;
}
__int64 Pollard(__int64 n){
        __int64 i, p, x,xx;
        for(i=1;i<MAX;i++){
                x = i;
                xx = f(x)%n;
                p = gcd((xx-x+n)%n,n);
                while(p==1){
                        x = f(x)%n;
                        xx = f( f(xx)%n )%n;
                        p = gcd( (xx-x+n)%n,n)%n;
                }
                if(p==0)continue ;
                else return p;
        }
        return -1;
}
//////////////////////////////////////////////////
void main(){
        __int64 a;
        while(scanf("%I64d",&a)!=EOF)
                if(Miller_Rabin(a))printf("prime\n");
                else printf("%I64d\n",Pollard(a));
}

【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 我贴一个吧,请指教。
: (以下程序只能平方不超过__int64的情况下应用,对大数据要定义大数运算)
: //////////////////////////////////////////////////////
: #define MAX 100
: __int64 random(){
:         __int64 a;
:         a = rand();
:         a *= rand();
:         a *= rand();
:         a *= rand();
: .................(以下省略)


──── magicpig (Mon Sep  6 22:07:22 2004)  ────────────

连分数分解是指?

【 在 kinfkong ( Pegasus@zsu 天马  ) 的大作中提到: 】
:  你会不会用连分数来分解?
: 【 在 iamcs (Savior) 的大作中提到: 】
: : 谁贴个Rabbin-Miller和 Pollard分解的代码吧


──── iamcs (Mon Sep  6 22:12:11 2004)   ─────────────

不懂。

【 在 kinfkong ( Pegasus@zsu 天马  ) 的大作中提到: 】
:  就是用连分数结合Legendre的方法来分解因子咯
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 连分数分解是指?


──── iamcs (Mon Sep  6 22:12:37 2004)   ─────────────

赞一个!

【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 我贴一个吧,请指教。
: (以下程序只能平方不超过__int64的情况下应用,对大数据要定义大数运算)
: //////////////////////////////////////////////////////
: #define MAX 100
: __int64 random(){
:         __int64 a;
:         a = rand();
:         a *= rand();
:         a *= rand();
:         a *= rand();
: .................(以下省略)


──── magicpig (Mon Sep  6 23:25:04 2004)  ────────────

第一次给人赞,很开心啊。
谢谢实哥
【 在 iamcs (Savior) 的大作中提到: 】
: 赞一个!
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 我贴一个吧,请指教。
: : (以下程序只能平方不超过__int64的情况下应用,对大数据要定义大数运算)
: : //////////////////////////////////////////////////////
: : #define MAX 100
: : __int64 random(){
: :         __int64 a;
: :         a = rand();
: :         a *= rand();
: .................(以下省略)


──── dynamic (Mon Sep  6 23:27:03 2004)   ────────────

呵呵,导论上就有的
失败的概率不超过1/4,很安全的

【 在 kinfkong ( Pegasus@zsu 天马  ) 的大作中提到: 】
:  终于明白了,原来我以前认识到的Miller-Rabin是如此的naive, 
:  只要改进一下,Carmichael Numbers居然是如此不堪一击.
: 【 在 kinfkong ( Pegasus@zsu 天马  ) 的大作中提到: 】
: :  点解你这个程序对Carmichael Numbers都可以成功检出来的?
: :  牛
: : .................(以下省略)


──── infant (Mon Sep  6 23:47:05 2004)  ─────────────

pollard p 算出来的是最小的那个因子吗?
如果要求其他因子是不是n=n/p再用一次?
【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 补充一个主函数,完整代码:
: #include <stdio.h>
: #include <stdlib.h>
: #define MAX 100
: __int64 random(){
:         __int64 a;
:         a = rand();
:         a *= rand();
:         a *= rand();
:         return a;
: .................(以下省略)


──── infant (Mon Sep  6 23:53:50 2004)  ─────────────

好像书上说只要查找2lg^2次证据就行了。那么就是说循环2lg^2就一定保险了,对吗?
【 在 dynamic (Retired Prometheus) 的大作中提到: 】
: 呵呵,导论上就有的
: 失败的概率不超过1/4,很安全的
: 【 在 kinfkong ( Pegasus@zsu 天马  ) 的大作中提到: 】
: :  终于明白了,原来我以前认识到的Miller-Rabin是如此的naive, 
: :  只要改进一下,Carmichael Numbers居然是如此不堪一击.


──── magicpig (Mon Sep  6 23:56:15 2004)  ────────────

求其他因子,n=n/p,然后检验其素性再分解
对于pku那题,
我们只要先检验 2到10^6是否有其因子,如果没有
就证明只可能两个大因子,那样子用pollard p找出
一个因子p,再求q = n/p
然后min(p,q)

【 在 infant (infant) 的大作中提到: 】
: pollard p 算出来的是最小的那个因子吗?
: 如果要求其他因子是不是n=n/p再用一次?
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 补充一个主函数,完整代码:
: : #include <stdio.h>
: : #include <stdlib.h>
: : #define MAX 100
: : __int64 random(){
: :         __int64 a;
: :         a = rand();
: .................(以下省略)


──── magicpig (Tue Sep  7 00:00:40 2004)  ────────────

一定?
六合彩也有人中,肯定会有失败的时候。
如果次数足够,失败概率几乎是0,所以安全啊。
对了,2lg^2是什么意思?

【 在 infant (infant) 的大作中提到: 】
: 好像书上说只要查找2lg^2次证据就行了。那么就是说循环2lg^2就一定保险了,对吗?
: 【 在 dynamic (Retired Prometheus) 的大作中提到: 】
: : 呵呵,导论上就有的
: : 失败的概率不超过1/4,很安全的


──── infant (Tue Sep  7 00:05:12 2004)  ─────────────

哦,我懂了。其实可以是2到2^18,这样更省一点,对吧 ^_^
谢谢师兄。^_^
【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 求其他因子,n=n/p,然后检验其素性再分解
: 对于pku那题,
: 我们只要先检验 2到10^6是否有其因子,如果没有
: 就证明只可能两个大因子,那样子用pollard p找出
: 一个因子p,再求q = n/p
: 然后min(p,q)
: 【 在 infant (infant) 的大作中提到: 】
: : pollard p 算出来的是最小的那个因子吗?
: : 如果要求其他因子是不是n=n/p再用一次?
: : .................(以下省略)


──── magicpig (Tue Sep  7 00:07:23 2004)  ────────────

^_^
师弟算的那么准确。

【 在 infant (infant) 的大作中提到: 】
: 哦,我懂了。其实可以是2到2^18,这样更省一点,对吧 ^_^
: 谢谢师兄。^_^
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 求其他因子,n=n/p,然后检验其素性再分解
: : 对于pku那题,
: : 我们只要先检验 2到10^6是否有其因子,如果没有
: : 就证明只可能两个大因子,那样子用pollard p找出
: : 一个因子p,再求q = n/p
: : 然后min(p,q)


──── magicpig (Tue Sep  7 00:08:09 2004)  ────────────

暂时放在你那里,我现在没穿上衣,懒得走来走去。
^_^

【 在 kinfkong ( Pegasus@zsu 天马  ) 的大作中提到: 】
:  你下来取回你的书吧 :-)
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 求其他因子,n=n/p,然后检验其素性再分解
: : 对于pku那题,
: : 我们只要先检验 2到10^6是否有其因子,如果没有
: : 就证明只可能两个大因子,那样子用pollard p找出
: : 一个因子p,再求q = n/p
: : 然后min(p,q)


──── infant (Tue Sep  7 00:09:18 2004)  ─────────────

书上说如果n是合数,那么只要查找大小为2lg^2的证据就可以了。所以总的复杂度是
O(lg^5)。
【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 一定?
: 六合彩也有人中,肯定会有失败的时候。
: 如果次数足够,失败概率几乎是0,所以安全啊。
: 对了,2lg^2是什么意思?
: 【 在 infant (infant) 的大作中提到: 】
: : 好像书上说只要查找2lg^2次证据就行了。那么就是说循环2lg^2就一定保险了,对吗?


──── iamcs (Tue Sep  7 00:23:46 2004)   ─────────────

我的更加naive...

【 在 kinfkong ( Pegasus@zsu 天马  ) 的大作中提到: 】
:  终于明白了,原来我以前认识到的Miller-Rabin是如此的naive, 
:  只要改进一下,Carmichael Numbers居然是如此不堪一击.
: 【 在 kinfkong ( Pegasus@zsu 天马  ) 的大作中提到: 】
: :  点解你这个程序对Carmichael Numbers都可以成功检出来的?
: :  牛
: : .................(以下省略)


──── infant (Tue Sep  7 00:24:55 2004)  ─────────────

哦,对了。师兄我一直搞不懂为什么square_multiply的时间是lg^3。
他做了lg次乘和除,也就是说一次乘和除的时间是lg^2,对吗?
问题可能太弱了,可是我就是想不通。^_^|||
【 在 infant (infant) 的大作中提到: 】
: 书上说如果n是合数,那么只要查找大小为2lg^2的证据就可以了。所以总的复杂度是
: O(lg^5)。
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 一定?
: : 六合彩也有人中,肯定会有失败的时候。
: : 如果次数足够,失败概率几乎是0,所以安全啊。
: : 对了,2lg^2是什么意思?


──── magicpig (Tue Sep  7 00:31:32 2004)  ────────────

做一次乘法或取模是lg^2
平方乘要做lg次循环
所以Lg^3

【 在 infant (infant) 的大作中提到: 】
哦,对了。师兄我一直搞不懂为什么square_multiply的时间是lg^3。
他做了lg次乘和除,也就是说一次乘和除的时间是lg^2,对吗?
问题可能太弱了,可是我就是想不通。^_^|||
【 在 infant (infant) 的大作中提到: 】
: 书上说如果n是合数,那么只要查找大小为2lg^2的证据就可以了。所以总的复杂度是
: O(lg^5)。
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 一定?
: : 六合彩也有人中,肯定会有失败的时候。
: : 如果次数足够,失败概率几乎是0,所以安全啊。
: : 对了,2lg^2是什么意思?


──── iamcs (Tue Sep  7 00:49:11 2004)   ─────────────

你的Pollard分解中x是循环变量,但是中间又改变了x的值,如果
第一个x的值不成功的话,就会有些怪异。

【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 补充一个主函数,完整代码:
: #include <stdio.h>
: #include <stdlib.h>
: #define MAX 100
: __int64 random(){
:         __int64 a;
:         a = rand();
:         a *= rand();
:         a *= rand();
:         return a;
: .................(以下省略)


──── infant (Tue Sep  7 00:51:47 2004)  ─────────────

哦,懂了。我真是个大SB。^_^|||
【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 做一次乘法或取模是lg^2
: 平方乘要做lg次循环
: 所以Lg^3
: 【 在 infant (infant) 的大作中提到: 】
: 哦,对了。师兄我一直搞不懂为什么square_multiply的时间是lg^3。
: 他做了lg次乘和除,也就是说一次乘和除的时间是lg^2,对吗?
: 问题可能太弱了,可是我就是想不通。^_^|||
: 【 在 infant (infant) 的大作中提到: 】
: : 书上说如果n是合数,那么只要查找大小为2lg^2的证据就可以了。所以总的复杂度是
: : O(lg^5)。


──── infant (Tue Sep  7 00:57:18 2004)  ─────────────

好像是波!! 师兄是不是该加多一个循环变量会好些?
【 在 iamcs (Savior) 的大作中提到: 】
: 你的Pollard分解中x是循环变量,但是中间又改变了x的值,如果
: 第一个x的值不成功的话,就会有些怪异。
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 补充一个主函数,完整代码:
: : #include <stdio.h>
: : #include <stdlib.h>
: : #define MAX 100
: : __int64 random(){
: :         __int64 a;
: :         a = rand();
: .................(以下省略)


──── zhonglei (Tue Sep  7 00:59:52 2004)  ────────────


【 在 infant (infant) 的大作中提到: 】
: 好像是波!! 师兄是不是该加多一个循环变量会好些?
: 【 在 iamcs (Savior) 的大作中提到: 】
: : 你的Pollard分解中x是循环变量,但是中间又改变了x的值,如果
: : 第一个x的值不成功的话,就会有些怪异。
: : .................(以下省略)
大家讨论好热烈啊。。。

──── dynamic (Tue Sep  7 01:00:45 2004)   ────────────

传说你闭关...

【 在 zhonglei (radium) 的大作中提到: 】
: 
: 【 在 infant (infant) 的大作中提到: 】
: : 好像是波!! 师兄是不是该加多一个循环变量会好些?
: : 【 在 iamcs (Savior) 的大作中提到: 】
: 大家讨论好热烈啊。。。


──── magicpig (Tue Sep  7 01:01:02 2004)  ────────────

不好意思,要改改才行。
^_^

【 在 iamcs (Savior) 的大作中提到: 】
: 你的Pollard分解中x是循环变量,但是中间又改变了x的值,如果
: 第一个x的值不成功的话,就会有些怪异。
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 补充一个主函数,完整代码:
: : #include <stdio.h>
: : #include <stdlib.h>
: : #define MAX 100
: : __int64 random(){
: :         __int64 a;
: :         a = rand();
: .................(以下省略)


──── magicpig (Tue Sep  7 01:04:05 2004)  ────────────

谢谢提醒,现在改了。
【 在 iamcs (Savior) 的大作中提到: 】
你的Pollard分解中x是循环变量,但是中间又改变了x的值,如果
第一个x的值不成功的话,就会有些怪异。

【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 补充一个主函数,完整代码:
: #include <stdio.h>
: #include <stdlib.h>
: #define MAX 100
: __int64 random(){
:         __int64 a;
:         a = rand();
:         a *= rand();
:         a *= rand();
:         return a;
: .................(以下省略)


──── magicpig (Tue Sep  7 01:06:23 2004)  ────────────

radium出关之日,我们队开始强盛了
【 在 dynamic (Retired Prometheus) 的大作中提到: 】
: 传说你闭关...
: 【 在 zhonglei (radium) 的大作中提到: 】
: : 大家讨论好热烈啊。。。


──── magicpig (Tue Sep  7 01:10:15 2004)  ────────────

^_^
弱啊。
【 在 infant (infant) 的大作中提到: 】
: 呵呵,师兄,好像你这次不比我上次强多少呀 ^_^
: 怎么犯低级错误成了我们队的传统呀!真奇怪。^_^
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 不好意思,要改改才行。
: : ^_^


──── zhonglei (Tue Sep  7 01:33:06 2004)  ────────────


【 在 dynamic (Retired Prometheus) 的大作中提到: 】
: 传说你闭关...
: 【 在 zhonglei (radium) 的大作中提到: 】
: : 
: : 大家讨论好热烈啊。。。
哪里传出来的啊

──── iamcs (Tue Sep  7 08:19:24 2004)   ─────────────

PKU这题有可能中间过程超过in64的范围,怎么办?

【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 求其他因子,n=n/p,然后检验其素性再分解
: 对于pku那题,
: 我们只要先检验 2到10^6是否有其因子,如果没有
: 就证明只可能两个大因子,那样子用pollard p找出
: 一个因子p,再求q = n/p
: 然后min(p,q)
: 【 在 infant (infant) 的大作中提到: 】
: : pollard p 算出来的是最小的那个因子吗?
: : 如果要求其他因子是不是n=n/p再用一次?
: : .................(以下省略)


──── magicpig (Tue Sep  7 08:39:51 2004)  ────────────

做一下处理,我是自己定义一个这样的乘法。
a*b的时候不直接乘,把a两位两位乘于b,再取模
因为b最大为2^54,100<2^9=512,所以2^54 * 100<2^63
这样子不会溢出。(可以把100扩大到512)
typedef __int64 pp;
// (a*b)%n
pp by(pp a, pp b, pp n){
        pp t, i, r, j;
        t = i = 0;
        while(a){
                r = (a%100)*b;
                r %= n;
                for(j=0;j<i;j++)r=(r*100)%n;
                t+=r;
                t%=n;
                a/=100;
                i++;
        }
        return t;
}

【 在 iamcs (Savior) 的大作中提到: 】
: PKU这题有可能中间过程超过in64的范围,怎么办?
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 求其他因子,n=n/p,然后检验其素性再分解
: : 对于pku那题,
: : 我们只要先检验 2到10^6是否有其因子,如果没有
: : 就证明只可能两个大因子,那样子用pollard p找出
: : 一个因子p,再求q = n/p
: : 然后min(p,q)


──── iamcs (Tue Sep  7 08:49:48 2004)   ─────────────

555...好麻烦。

【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 做一下处理,我是自己定义一个这样的乘法。
: a*b的时候不直接乘,把a两位两位乘于b,再取模
: 因为b最大为2^54,100<2^9=512,所以2^54 * 100<2^63
: 这样子不会溢出。(可以把100扩大到512)
: typedef __int64 pp;
: // (a*b)%n
: pp by(pp a, pp b, pp n){
:         pp t, i, r, j;
:         t = i = 0;
:         while(a){
: .................(以下省略)


──── magicpig (Tue Sep  7 08:54:54 2004)  ────────────

比如
a = 12312
其实可以把a分解 a = 12 + 23*100+ 1*(100)^2
(a*b)%n =
( ( (12*b)%n + (((23*b)%n)*100 )%n )%n  + (((((1*b)%n)*100)%n)*100)%n   )%n
    -------    ------------------        ---------------------------  
   -----------------
--------------------------------------

这样子做一次乘法取一次模,
而且两个因子的位数保证了不会溢出。

【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 做一下处理,我是自己定义一个这样的乘法。
: a*b的时候不直接乘,把a两位两位乘于b,再取模
: 因为b最大为2^54,100<2^9=512,所以2^54 * 100<2^63
: 这样子不会溢出。(可以把100扩大到512)
: typedef __int64 pp;
: // (a*b)%n
: pp by(pp a, pp b, pp n){
:         pp t, i, r, j;
:         t = i = 0;
:         while(a){
: .................(以下省略)


──── magicpig (Tue Sep  7 08:55:46 2004)  ────────────

^_^
我想不到好方法,实哥有什么好的策略吗?

【 在 iamcs (Savior) 的大作中提到: 】
: 555...好麻烦。
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : 做一下处理,我是自己定义一个这样的乘法。
: : a*b的时候不直接乘,把a两位两位乘于b,再取模
: : 因为b最大为2^54,100<2^9=512,所以2^54 * 100<2^63
: : 这样子不会溢出。(可以把100扩大到512)
: : typedef __int64 pp;
: : // (a*b)%n
: : pp by(pp a, pp b, pp n){
: :         pp t, i, r, j;
: .................(以下省略)


──── iamcs (Tue Sep  7 08:56:55 2004)   ─────────────

还是这样做比较好。

【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: ^_^
: 我想不到好方法,实哥有什么好的策略吗?
: 【 在 iamcs (Savior) 的大作中提到: 】
: : 555...好麻烦。
: : .................(以下省略)


──── iamcs (Tue Sep  7 12:30:59 2004)   ─────────────

受不了!总是WA,完全按照你说的做的,奇怪。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

typedef long long I64;

int primen;
int prime[25000];

I64 abs(I64 x)
{
  return (x<0)?(-x):x;
}

I64 mod_mul(I64 x,I64 y,I64 n)
{  
  if(!x) return 0;
  return (((x&255)*y)%n+(mod_mul(x>>8,y,n)<<8)%n)%n;
}

I64 myrand()
{
  I64 a=rand();
  a*=rand();
  return abs(a);
}

I64 mod_exp(I64 a,I64 x,I64 n)
{  
  I64 ret=1;
  
  while(x) {
    if(x&1) ret=mod_mul(ret,a,n);
    a=mod_mul(a,a,n);
    x>>=1;
  }
  return ret;
}

I64 gcd(I64 x,I64 y)
{
  I64 q;

  while(1) {
    if(!y) return abs(x);
    q=x,x=y,y=q%y;
  }
}

bool Rabin_Miller(I64 n)
{
  I64 k=0,i,j,m,a;
  
  if(n<2) return 0;
  if(n==2) return 1;
  if(!(n&1)) return 0;
  m=n-1;
  while(!(m&1)) m>>=1,k++;
  for(i=0;i<100;i++) {
    a=myrand()%(n-2)+2;
    a=mod_exp(a,m,n);
    if(a==1) continue;
    for(j=0;j<k;j++) {
      if(a==n-1) break;
      a=mod_mul(a,a,n);
    }
    if(j<k) continue;
    return 0;
  }
  return 1;
}

I64 func(I64 x,I64 n)
{
  return (mod_mul(x,x,n)+1)%n;
}

I64 Pollard(I64 n)
{
  I64 i,x,y,p;

  if(!(n&1)) return 2;
  for(i=1;i<100;i++) {
    x=i;
    y=func(x,n);
    p=gcd(y-x,n);
    while(p==1) {
      x=func(x,n);
      y=func(func(y,n),n);
      p=gcd((y-x+n)%n,n)%n;
    }
    if(p==0 || p==n) continue;
    return p;
  }
  return -1;
}

void init()
{
  const int MAXC=1<<18;
  bool flag[MAXC]={0};
  int i,j,k;

  for(i=2;i*i<MAXC;i++) if(!flag[i])
    for(j=i*i;j<MAXC;j+=i) flag[j]=1;
  primen=0;
  for(i=2;i<MAXC;i++) if(!flag[i]) prime[primen++]=i;  
}

int scan(I64 p)
{
  int i;

  for(i=0;i<primen && prime[i]<=p;i++) 
    if(p%prime[i]==0) return prime[i];
  return -1;
}

int main()
{
  int casen;
  I64 n,p,q;

  srand((unsigned)time(NULL));

  init();
  scanf("%d",&casen);
  while(casen-->0) {
    scanf("%lld",&n);
    if(Rabin_Miller(n)) printf("Prime\n"); else {
      p=scan(n);
      if(p<0) {
        p=Pollard(n);
        q=n/p;
        if(q<p) p=q;
      }
      printf("%lld\n",p);
    }
  }
  return 0;
}

【 在 iamcs (Savior) 的大作中提到: 】
: 还是这样做比较好。
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: : ^_^
: : 我想不到好方法,实哥有什么好的策略吗?


──── infant (Tue Sep  7 12:34:02 2004)  ─────────────

hehe,实哥也有郁闷的时候,罕见丫 ^_^
【 在 iamcs (Savior) 的大作中提到: 】
: 受不了!总是WA,完全按照你说的做的,奇怪。
: #include <stdio.h>
: #include <stdlib.h>
: #include <math.h>
: #include <time.h>
: typedef long long I64;
: int primen;
: int prime[25000];
: I64 abs(I64 x)
: {
: .................(以下省略)


──── iamcs (Tue Sep  7 12:34:51 2004)   ─────────────

我自己写的abs

【 在 kinfkong ( Pegasus@zsu 天马  ) 的大作中提到: 】
:  我记得,abs()用在64bit interger里是有问题的,你改改试试
: 【 在 iamcs (Savior) 的大作中提到: 】
: : 受不了!总是WA,完全按照你说的做的,奇怪。
: : #include <stdio.h>
: : #include <stdlib.h>
: : #include <math.h>
: : #include <time.h>
: : typedef long long I64;
: : int primen;
: : int prime[25000];
: .................(以下省略)


──── iamcs (Tue Sep  7 12:35:16 2004)   ─────────────

我郁闷的时候多了

【 在 infant (infant) 的大作中提到: 】
: hehe,实哥也有郁闷的时候,罕见丫 ^_^
: 【 在 iamcs (Savior) 的大作中提到: 】
: : 受不了!总是WA,完全按照你说的做的,奇怪。
: : #include <stdio.h>
: : #include <stdlib.h>
: : #include <math.h>
: : #include <time.h>
: : typedef long long I64;
: : int primen;
: : int prime[25000];
: .................(以下省略)


──── iamcs (Tue Sep  7 12:52:15 2004)   ─────────────

!!! long long 的问题

【 在 Mathematica (Lupus@zsu 天狼) 的大作中提到: 】
: 改成这样就AC了,奇怪
: /////////////
: #include <stdio.h>
: #include <stdlib.h>
: #include <math.h>
: #include <time.h>
: typedef __int64 I64;
: int primen;
: int prime[25000];
: I64 abs(I64 x)
: .................(以下省略)


──── iamcs (Tue Sep  7 12:53:38 2004)   ─────────────

OK
大家去把
UVA 10392 和 ZOJ 1823 都干了!

【 在 iamcs (Savior) 的大作中提到: 】
: !!! long long 的问题
: 【 在 Mathematica (Lupus@zsu 天狼) 的大作中提到: 】
: : 改成这样就AC了,奇怪
: : /////////////
: : #include <stdio.h>
: : #include <stdlib.h>
: : #include <math.h>
: : #include <time.h>
: : typedef __int64 I64;
: : int primen;
: .................(以下省略)


──── iamcs (Tue Sep  7 12:54:52 2004)   ─────────────

是选的这个,不选这个long long 通不过编译的

【 在 Mathematica (Lupus@zsu 天狼) 的大作中提到: 】
: submit时选C++(GCC)
: 【 在 iamcs (Savior) 的大作中提到: 】
: : !!! long long 的问题
: : .................(以下省略)


──── dynamic (Tue Sep  7 12:55:31 2004)   ────────────

zoj那个不行的,呵呵

【 在 iamcs (Savior) 的大作中提到: 】
: OK
: 大家去把
: UVA 10392 和 ZOJ 1823 都干了!
: 【 在 iamcs (Savior) 的大作中提到: 】
: : !!! long long 的问题
: : .................(以下省略)


──── dynamic (Tue Sep  7 12:59:17 2004)   ────────────

嗯,对,都不行~
要写高精的

【 在 Mathematica (Lupus@zsu 天狼) 的大作中提到: 】
: UVA的是同一题
: 【 在 dynamic (Retired Prometheus) 的大作中提到: 】
: zoj那个不行的,呵呵
: 【 在 iamcs (Savior) 的大作中提到: 】
: : OK
: : 大家去把
: : UVA 10392 和 ZOJ 1823 都干了!


──── iamcs (Tue Sep  7 13:01:27 2004)   ─────────────

哈,偶的可以。

【 在 dynamic (Retired Prometheus) 的大作中提到: 】
: 嗯,对,都不行~
: 要写高精的
: 【 在 Mathematica (Lupus@zsu 天狼) 的大作中提到: 】
: : UVA的是同一题
: : zoj那个不行的,呵呵


──── dynamic (Tue Sep  7 13:03:06 2004)   ────────────

那题没有<2^54这个限制

【 在 iamcs (Savior) 的大作中提到: 】
: 哈,偶的可以。
: 【 在 dynamic (Retired Prometheus) 的大作中提到: 】
: : 嗯,对,都不行~
: : 要写高精的


──── iamcs (Tue Sep  7 13:03:28 2004)   ─────────────

//ZOJ 1823 By Savior
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

typedef long long I64;

int ansn;
I64 ans[100];

I64 abs(I64 x)
{
  return (x<0)?(-x):x;
}

I64 mod_mul(I64 x,I64 y,I64 n)
{  
  if(!x) return 0;
  return (((x&1)*y)%n+(mod_mul(x>>1,y,n)<<1)%n)%n;
}

I64 myrand()
{
  I64 a=rand();
  a*=rand();
  return abs(a);
}

I64 mod_exp(I64 a,I64 x,I64 n)
{  
  I64 ret=1;
  
  while(x) {
    if(x&1) ret=mod_mul(ret,a,n);
    a=mod_mul(a,a,n);
    x>>=1;
  }
  return ret;
}

I64 gcd(I64 x,I64 y)
{
  I64 q;

  while(1) {
    if(!y) return abs(x);
    q=x,x=y,y=q%y;
  }
}

bool Rabin_Miller(I64 n)
{
  I64 k=0,i,j,m,a;
  
  if(n<2) return 0;
  if(n==2) return 1;
  if(!(n&1)) return 0;
  m=n-1;
  while(!(m&1)) m>>=1,k++;
  for(i=0;i<20;i++) {
    a=myrand()%(n-2)+2;
    a=mod_exp(a,m,n);
    if(a==1) continue;
    for(j=0;j<k;j++) {
      if(a==n-1) break;
      a=mod_mul(a,a,n);
    }
    if(j<k) continue;
    return 0;
  }
  return 1;
}

I64 func(I64 x,I64 n)
{
  return (mod_mul(x,x,n)+1)%n;
}

void Pollard(I64 n)
{
  I64 i,x,y,p;

  if(Rabin_Miller(n)) {
    ans[ansn++]=n;
    return;
  }
  if(!(n&1)) {
    Pollard(2);
    Pollard(n>>1);
    return;
  }
  for(i=1;i<20;i++) {
    x=i;
    y=func(x,n);
    p=gcd(y-x,n);
    while(p==1) {
      x=func(x,n);
      y=func(func(y,n),n);
      p=gcd((y-x+n)%n,n)%n;
    }
    if(p==0 || p==n) continue;
    Pollard(p);
    Pollard(n/p);
    return;
  }
}

void output()
{
  int i,j;
  I64 tmp;

  for(i=0;i<ansn;i++)
    for(j=i+1;j<ansn;j++) if(ans[i]>ans[j])
      tmp=ans[i],ans[i]=ans[j],ans[j]=tmp;
  for(i=0;i<ansn;i++) printf("%lld\n",ans[i]);
  printf("\n");
}

int main()
{
  int casen;
  I64 n;

  srand((unsigned)time(NULL));

  while(scanf("%lld",&n)==1) {
    if(n<0) break;
    ansn=0;
    Pollard(n);
    output();
  }
  return 0;
}

【 在 iamcs (Savior) 的大作中提到: 】
: 哈,偶的可以。
: 【 在 dynamic (Retired Prometheus) 的大作中提到: 】
: : 嗯,对,都不行~
: : 要写高精的


──── iamcs (Tue Sep  7 13:04:15 2004)   ─────────────

理论上会超的,可能没有这样的数据。

【 在 iamcs (Savior) 的大作中提到: 】
: //ZOJ 1823 By Savior
: #include <stdio.h>
: #include <stdlib.h>
: #include <math.h>
: #include <time.h>
: typedef long long I64;
: int ansn;
: I64 ans[100];
: I64 abs(I64 x)
: {
: .................(以下省略)


──── Jericho (Tue Sep  7 13:04:39 2004)   ────────────

1823早就写了,而且比你快,咔咔
【 在 iamcs (Savior) 的大作中提到: 】
: //ZOJ 1823 By Savior
: #include <stdio.h>
: #include <stdlib.h>
: #include <math.h>
: #include <time.h>
: typedef long long I64;
: int ansn;
: I64 ans[100];
: I64 abs(I64 x)
: {
: .................(以下省略)


──── iamcs (Tue Sep  7 13:05:26 2004)   ─────────────

是这样做的?

【 在 Jericho (Jericho) 的大作中提到: 】
: 1823早就写了,而且比你快,咔咔
: 【 在 iamcs (Savior) 的大作中提到: 】
: : //ZOJ 1823 By Savior
: : #include <stdio.h>
: : #include <stdlib.h>
: : #include <math.h>
: : #include <time.h>
: : typedef long long I64;
: : int ansn;
: : I64 ans[100];
: .................(以下省略)


──── dynamic (Tue Sep  7 13:05:37 2004)   ────────────

左移那一步应该先转unsigned long long

当然也有可能虽然越界了,但再取模之后可以保证结果是对的,可以考虑一下

【 在 iamcs (Savior) 的大作中提到: 】
: 理论上会超的,可能没有这样的数据。
: 【 在 iamcs (Savior) 的大作中提到: 】
: : //ZOJ 1823 By Savior
: : #include <stdio.h>
: : #include <stdlib.h>
: : #include <math.h>
: : #include <time.h>
: : typedef long long I64;
: : int ansn;
: : I64 ans[100];
: .................(以下省略)


──── Jericho (Tue Sep  7 13:06:29 2004)   ────────────

no....
【 在 iamcs (Savior) 的大作中提到: 】
: 是这样做的?
: 【 在 Jericho (Jericho) 的大作中提到: 】
: : 1823早就写了,而且比你快,咔咔
: : .................(以下省略)


──── iamcs (Tue Sep  7 13:07:52 2004)   ─────────────

数据弱,UVA的也弱。

【 在 Jericho (Jericho) 的大作中提到: 】
: no....
: 【 在 iamcs (Savior) 的大作中提到: 】
: : 是这样做的?


──── dynamic (Tue Sep  7 13:11:33 2004)   ────────────

用的都是waterloo的数据

【 在 iamcs (Savior) 的大作中提到: 】
: 数据弱,UVA的也弱。
: 【 在 Jericho (Jericho) 的大作中提到: 】
: : no....


──── iamcs (Tue Sep  7 13:12:41 2004)   ─────────────

4611686014132420609
这个数据应该过不了

【 在 Jericho (Jericho) 的大作中提到: 】
: no....
: 【 在 iamcs (Savior) 的大作中提到: 】
: : 是这样做的?


──── iamcs (Tue Sep  7 13:13:47 2004)   ─────────────

唉,他们为什么不搞一个
2147483647^2 ,这样就爽多了。

【 在 dynamic (Retired Prometheus) 的大作中提到: 】
: 用的都是waterloo的数据
: 【 在 iamcs (Savior) 的大作中提到: 】
: : 数据弱,UVA的也弱。


──── Jericho (Tue Sep  7 13:16:53 2004)   ────────────

nod.....
【 在 iamcs (Savior) 的大作中提到: 】
: 4611686014132420609
: 这个数据应该过不了
: 【 在 Jericho (Jericho) 的大作中提到: 】
: : no....


──── Jericho (Tue Sep  7 13:19:44 2004)   ────────────

我发觉我的是错的-_-,但可以过到数据而已。。。。
【 在 Mathematica (Lupus@zsu 天狼) 的大作中提到: 】
: 队长的好快,厉害,佩服
: 【 在 Jericho (Jericho) 的大作中提到: 】
: : 1823早就写了,而且比你快,咔咔
: : .................(以下省略)


──── magicpig (Tue Sep  7 13:28:17 2004)  ────────────


【 在 Jericho (Jericho) 的大作中提到: 】
: 我发觉我的是错的-_-,但可以过到数据而已。。。。
                        ------------------在比赛中,这个就是真理。        

: 【 在 Mathematica (Lupus@zsu 天狼) 的大作中提到: 】
: : 队长的好快,厉害,佩服


──── henryouly (Tue Sep  7 13:28:55 2004)   ───────────

又想起dy那句话:我不保证我的程序是对的,但是保证可以过评委所有数据
【 在 Jericho (Jericho) 的大作中提到: 】
: 我发觉我的是错的-_-,但可以过到数据而已。。。。
: 【 在 Mathematica (Lupus@zsu 天狼) 的大作中提到: 】
: : 队长的好快,厉害,佩服


──── zhi (Tue Sep  7 18:10:12 2004)   ──────────────

比赛中是真理,但是平时做题时还是认真点好

【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: 【 在 Jericho (Jericho) 的大作中提到: 】
: : 我发觉我的是错的-_-,但可以过到数据而已。。。。
:                         ------------------在比赛中,这个就是真理。        


──── magicpig (Tue Sep  7 18:22:15 2004)  ────────────

平时要踏实,比赛要学会“狡猾”。
zhi哥教训的是。
【 在 zhi (max@Apollo) 的大作中提到: 】
: 比赛中是真理,但是平时做题时还是认真点好
: 【 在 magicpig (Aquila@zsu 天鹰) 的大作中提到: 】
: :                         ------------------在比赛中,这个就是真理。        



--
※ 来源:. 逸仙时空 Yat-sen Channel bbs.zsu.edu.cn. [FROM: 192.168.54.155]
※ 修改:.iamcs 于 Sep 24 16:53:15 修改本文.[FROM: 192.168.54.155]

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator