回 帖 发 新 帖 刷新版面

主题:一个漂亮的算法

 下面这个算法非常的漂亮,我把它引用过来。
来源 [url]http://bbs.pfan.cn/post-345989.html[/url]

[quote]typedef unsigned long long T;

T MyPlus( T a, T b, T c ) // (a+b)%c
{
    if(a+b>=a) return (a+b)%c; // 不溢出
    return (a%c+b%c-c);
}

T MyMultiplies( T a, T b, T c ) // (a*b)%c
{
    if(a*b/a==b) return (a*b)%c; // 不溢出

    T s = 0;
    for( T t=a; b; t=MyPlus(t,t,c),b>>=1 )
    {
        if( (b&1) != 0 )
            s = MyPlus(s,t,c);
    }
    return s;
}

T MyPower( T a, T b, T c ) // (a^b)%c
{
    T s = 1;
    for( T t=a; b; t=MyMultiplies(t,t,c),b>>=1 )
    {
        if( (b&1) != 0 )
            s = MyMultiplies(s,t,c);
    }
    return s;
}
 [/quote]


回复列表 (共5个回复)

沙发

(a^n)%p 可以直接用a和p就可以计算出T
------ 怎么求T呢?我没想出来
如果用for来依次试验,那么如果p很大,就可能会花费很长时间,比如
(2^n)%11 的周期是 10

板凳

2^n%12
2 4 8 4 8 4 8 ……

2^n%16
2 4 8 0 0 0 0 ……

要能够根据 a 和 p 得到 周期 以及 周期开始处

3 楼

楼上分析得非常正确,如果不是求像(a^b^c)%p这样的结果还是不能用求周期的那种方法好。

4 楼

看看网络版本的百科全书吧,上面或许有不错的算法,只要你懂点英语就可以看懂。

5 楼

回4楼:您是说维基百科么:)

我来回复

您尚未登录,请登录后再回复。点此登录或注册