Пример #1
0
int main()
{
	long long i,n,r,t,t1,t2,t3,t4,t5,crt;
	int cases,A,B;
	a[0][0]=1;a[0][1]=1;
	a[1][0]=1;a[1][1]=1;
	for(i=1;i<200007;i++){
		a[i][0] = (i*a[i-1][0])%2;
		//        printf("%d\n",a[i][0]);
		a[i][1] = (i*a[i-1][1])%500000003;
	}
	b_41[0][0]=1;b_41[0][1]=0;
	b_148721[0][0]=1;b_148721[0][1]=0;
	for(i=1;i<200007;i++){
		t=i;
		b_41[i][1]=b_41[i-1][1];
		while(t%41 == 0){t=t/41;b_41[i][1]++;}
		b_41[i][0] = (t*b_41[i-1][0])%1681;

		b_148721[i][0]=(i*b_148721[i-1][0])%148721;
		b_148721[i][1]=0;
	}
	//                printf("\n");
	scanf("%d",&cases);
	while(cases--)
	{
		scanf("%d %d %lld",&A,&B,&n);
		if(A==0 && B==0)
		{
			printf("1\n");
			continue;
		}        
		t3 = (a[2*n][0]*power(a[n][0],0,2))%2;
		t3 = (t3*power(a[n][0],0,2))%2;

		t4 = (b_41[2*n][0]*inverse2(b_41[n][0],1681))%1681;
		t4 = (t4*inverse2(b_41[n][0],1681))%1681;
		t4 = (t4*power(41,b_41[2*n][1]-2*b_41[n][1],1681))%1681;
//		printf("%lld",t4);
//		return 0;
		t5 = (b_148721[2*n][0]*power(b_148721[n][0],148719,148721))%148721;
		t5 = (t5*power(b_148721[n][0],148719,148721))%148721;
		//printf("t3=%lld t4=%lld t5=%lld\n",t3,t4,t5);
		crt = chinese_remainder_2(t3,t4,t5);

		t2 = power(B,crt,500000003);
		t1 = power(B,0,2);
		//printf("crt1=%lld t1=%lld t2=%lld\n",crt,t1,t2);
		//        t2 = (a[2*n][1]*power(a[n][1],500000001,500000003))%500000003;
		//       t2 = (t2*power(a[n][1],500000001,500000003))%500000003;
		//        printf("%lld\n",t2);
		crt = chinese_remainder(t1,t2);

		//printf("A=%d crt = %d\n",A,crt);
		printf("%lld\n",power(A,crt,1000000007));
	}
	return 0;

}
Пример #2
0
GF2m& GF2m::operator/=(const GF2m& b)
{
    GF2m z=b;
    inverse2(z.fn,z.fn);
    modmult2(fn,z.fn,fn);
    return *this;
}
Пример #3
0
GF2m operator/(const GF2m& b1,const GF2m& b2)
{
    GF2m abb;
    inverse2(b2.fn,abb.fn);
    modmult2(b1.fn,abb.fn,abb.fn);
    return abb;
}
Пример #4
0
int chinese_remainder_2(long long n1,long long n2,long long n3)
{
	int p1=2,p2=1681,p3=148721;
	long long m1,m2,m3;
	long long i1,i2,i3;
	long long m;
	int ans;
	m = p1*p2*p3;
	m1 = m/p1;m2=m/p2;m3=m/p3;
	i1 = inverse(m1,p1);i2=inverse2(m2,p2);i3=inverse(m3,p3);
	//printf("i1 = %lld   i2 = %lld\n",i1,i2);
	ans = (n1*m1*i1)%m+(n2*m2*i2)%m + (n3*m3*i3)%m ;
	ans = ans%m;
	return ans;
	//printf("%d\n",ans);
}
int main(int argc, char **argv)
{
	double a = 1234.0;
	double b;
	double r2,r3,r4,r5;

	b = 1.0 / a;
	r2 = inverse2(a);
	r3 = inverse3(a);
	r4 = inverse4(a);
	r5 = inverse5(a);

	printf("	   a = %5.16lf\n", a);
	printf("true 1/a = %5.16lf\n", b);
	printf("	  r2 = %5.16lf\n", r2);
	printf("	  r3 = %5.16lf\n", r3);
	printf("	  r4 = %5.16lf\n", r4);
	printf("	  r5 = %5.16lf\n", r5);

	return 0;
}
Пример #6
0
GF2m inverse(const GF2m& b) {
    GF2m r=b;
    inverse2(r.fn,r.fn);
    return r;
}
Пример #7
0
void invert(_MIPD_ big *x)
{
    int degF,degG,degB,degC,d,i,j;
    big alpha,beta,gamma,BB[4],FF[5],CC[4],GG[5],t;
    big *BP=BB,*CP=CC,*FP=FF,*GP=GG,*TP;
#ifndef MR_STATIC
    char *mem=(char *)memalloc(_MIPP_ 22);  
#else
    char mem[MR_BIG_RESERVE(22)];       /* 972 bytes from the stack */
    memset(mem,0,MR_BIG_RESERVE(22));
#endif

    alpha=mirvar_mem(_MIPP_ mem,0);
    beta=mirvar_mem(_MIPP_ mem,1);
    gamma=mirvar_mem(_MIPP_ mem,2);
    t=mirvar_mem(_MIPP_ mem,3);

    for (i=0;i<4;i++)
        BB[i]=mirvar_mem(_MIPP_ mem,4+i);
    for (i=0;i<5;i++)
        FF[i]=mirvar_mem(_MIPP_ mem,8+i);
    for (i=0;i<4;i++)
        CC[i]=mirvar_mem(_MIPP_ mem,13+i);
    for (i=0;i<5;i++)
        GG[i]=mirvar_mem(_MIPP_ mem,17+i);

    convert(_MIPP_ 1,CP[0]);
    convert(_MIPP_ 1,FP[0]);
    convert(_MIPP_ 1,FP[1]);
    convert(_MIPP_ 1,FP[4]);   /* F = x^4+x+1 - irreducible polynomial for GF(2^{4m}) */

    degF=4; degG=degree(x); degC=0; degB=-1;

    if (degG==0)
    {
        inverse2(_MIPP_ x[0],x[0]);
        return;
    }

    for (i=0;i<4;i++)
    {
        fcopy2(x[i],GP[i]);
        zero(x[i]);
    }

    while (degF!=0)
    {
        if (degF<degG)
        { /* swap */
            TP=FP; FP=GP; GP=TP;  d=degF; degF=degG; degG=d;
            TP=BP; BP=CP; CP=TP;  d=degB; degB=degC; degC=d;
        }
        j=degF-degG;
        modsquare2(_MIPP_ GP[degG],alpha);
        modmult2(_MIPP_ FP[degF],GP[degG],beta);
        modmult2(_MIPP_ GP[degG],FP[degF-1],t);
        modmult2(_MIPP_ FP[degF],GP[degG-1],gamma);
        fincr2(t,gamma);
        zero(t);

        for (i=0;i<=degF;i++ )
        {
            modmult2(_MIPP_ FP[i],alpha,FP[i]);
            if (i>=j-1)
            {
                modmult2(_MIPP_ gamma,GP[i-j+1],t);
                fincr2(t,FP[i]);
            }  
            if (i>=j)
            {
                modmult2(_MIPP_ beta,GP[i-j],t); 
                fincr2(t,FP[i]);
            }
        }	        
        for (i=0;i<=degB || i<=(degC+j);i++)
        {
            modmult2(_MIPP_ BP[i],alpha,BP[i]);
            if (i>=j-1)
            {	
                modmult2(_MIPP_ gamma,CP[i-j+1],t);	
                fincr2(t,BP[i]);
            }
            if (i>=j)  
            {
                modmult2(_MIPP_ beta,CP[i-j],t);
                fincr2(t,BP[i]);
            }
        }

        while (degF>=0 && size(FP[degF])==0) degF--;
        if (degF==degG)
        {
            fcopy2(FP[degF],alpha);
            for (i=0;i<=degF;i++)
            {
                modmult2(_MIPP_ FP[i],GP[degF],FP[i]);
                modmult2(_MIPP_ alpha,GP[i],t);
                fincr2(t,FP[i]);
            } 
            for (i=0;i<=4-degF;i++)
            {
                modmult2(_MIPP_ BP[i],GP[degF],BP[i]);
                modmult2(_MIPP_ CP[i],alpha,t);
                fincr2(t,BP[i]);

            }
            while (degF>=0 && size(FP[degF])==0) degF--;
        }
        degB=3; 
        while (degB>=0 && size(BP[degB])==0) degB--;
    }

    inverse2(_MIPP_ FP[0],alpha);

    for (i=0;i<=degB;i++)
        modmult2(_MIPP_ alpha,BP[i],x[i]);
#ifndef MR_STATIC   
    memkill(_MIPP_ mem,22);
#else
    memset(mem,0,MR_BIG_RESERVE(22));
#endif
}