快速乘?

Posted hehe54321

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速乘?相关的知识,希望对你有一定的参考价值。

快速乘测试对比程序:

技术分享图片
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll rd()
{
    return rand()|(ll(rand())<<32);
}
ll md;
ll mul1(ll x,ll y)
{
    x%=md;y%=md;
    ll t=x*y-ll((long double)x/md*y+0.5)*md;
    return t<0?t+md:t;
}
ll mul2(ll x,ll y)
{
    x%=md;y%=md;
    ll t=x*y-ll((long double)x*y/md+0.5)*md;
    return t<0?t+md:t;
}
ll mul3(ll x,ll y)
{
    x%=md;y%=md;
    ll t=x*y-ll((long double)x/md*y+1e-8)*md;
    return t<0?t+md:t;
}
ll mul0(ll x,ll y)
{
    return __int128(x)*y%md;
}
ll a,b;
int main()
{
    int T=0;
    srand(3254244);
    while(1)
    {
        T++;
        ll a=rd(),b=rd();
        md=rd();//%ll(1e18);
        //cout<<a<<‘ ‘<<b<<‘ ‘<<md<<‘
‘;
        ll t1=mul1(a,b),t2=mul0(a,b);//可将mul1改为mul2/mul3
        //cout<<t1<<‘ ‘<<t2<<‘
‘;
        if(t1!=t2)
        {
            printf("%d
",T);
            puts("test");
            int t;cin>>t;
        }
        //int t;cin>>t;
    }
    return 0;
}
View Code

经过一些测试,可以发现,mul3效果最差(在模数>=1e17时,100000组以内就拍出锅);应该是1e-8不够

mul2效果没有mul1好(模数不设额外上限时,100000组以内出锅;上限1e18时,20秒不出锅)

mul1效果最好(模数不设额外上限时,20秒不出锅)

原因就不知道了。。。

 

以上是关于快速乘?的主要内容,如果未能解决你的问题,请参考以下文章

c#代码片段快速构建代码

毕业设计/Matlab系列基于最小二乘滤波WLS和快速双边滤波显示HDR图像

快速乘快速幂(矩阵快速幂)

快速幂和快速乘

快速幂和快速乘

前端开发工具vscode如何快速生成代码片段