Beispiel #1
0
void bigmul (int *s, int *t) {
  int i;
  memset (sum, 0, sizeof(int)*MAXN);
  for (i=0; i<MAXN; i++) {
    bitmul (s, t[i], i);
    bigadd (sum, bitp);
  }
}
Beispiel #2
0
/* fibo: calculate fibonacci number from 0 to 5000 */
void fibo(void)
{
    int i, digit;

    number[0][0] = 0;
    number[1][0] = digit = 1;
    for (i = 2; i < MAXN; i++)
        digit = bigadd(i, i - 1, i - 2, digit);
}
// Multiplicates n words in s by f, adds s2, stores result to d, returns overflow word
rawtype basemuladd (rawtype *dest, rawtype *src1, rawtype *src2, rawtype src3, size_t len, rawtype carry)
{
    size_t t;
    rawtype tmp[2], tmpcarry[2];

    tmpcarry[0] = carry;
    tmpcarry[1] = 0;

    for (t = len; t--;)
    {
        tmp[1] = bigmul (tmp, src1 + t, src3, 1);
        bigadd (tmp, tmpcarry, 1, 1);
        if (src2) bigadd (tmp, src2 + t, 1, 1);
        dest[t] = bigdiv (tmpcarry, tmp, Base, 2);
    }

    return tmpcarry[0];
}
Beispiel #4
0
bignum *bigincrement(bignum *n,size_t by_n)
{
    ABORT_NABN(n);

    while(by_n--)
    bigadd(n,&BIGONE,n);
    ABORT_NABN(n);
    return n;
}
/* fibo: calculate fibonacci number from 0 to 5000 */
void fibo(int **n)
{
    int i, digit;

    n[0][0] = 0;
    n[1][0] = digit = 1;
    for (i = 2; i < MAXN; i++)
        digit = bigadd(n[i], n[i - 1], n[i - 2], digit);

}
Beispiel #6
0
int main()
{
	int n,len;
	while(scanf("%s%s%s",s1,s2)!=EOF)
	{
		change(s1);
		change(s2);//翻转运算数
		bigadd(s1,s2,ans);
	}
	return 0;
}
Beispiel #7
0
void adddigits(bignum ret, bignum num)
{
	int i;
	bignum temp;

	for(i = 0; i < num->pos; i++)
	{
		bigset(temp, num->num[i], 10);
		bigadd(ret, ret, temp);
	}
}
// Adds n words from s to d, returns overflow carry bit
rawtype baseadd (rawtype *dest, rawtype *src1, rawtype *src2, size_t len, rawtype carry)
{
    size_t t;

    for (t = len; t--;)
    {
        dest[t] = src1[t];
        bigadd (dest + t, &carry, 1);
        if ((src2 && bigadd (dest + t, src2 + t, 1) != 0) ||
            bigcmp (dest + t, &Base, 1) >= 0)
        {
            bigsub (dest + t, &Base, 1);
            carry = 1;
        }
        else
        {
            carry = 0;
        }
    }

    return carry;
}
// Subtracts n words s from d, returns subtract carry bit (1)
rawtype basesub (rawtype *dest, rawtype *src1, rawtype *src2, size_t len, rawtype carry)
{
    size_t t;
    rawtype tmp;

    for (t = len; t--;)
    {
        dest[t] = (src1 ? src1[t] : 0);
        tmp = (src2 ? src2[t] : 0);
        bigadd (&tmp, &carry, 1);
        if (bigsub (dest + t, &tmp, 1) != 0)
        {
            bigadd (dest + t, &Base, 1);
            carry = 1;
        }
        else
        {
            carry = 0;
        }
    }

    return carry;
}
Beispiel #10
0
Datei: pro.cpp Projekt: qbolec/c
void bigmult( int * a,int * b,int * r)
{
   if(b[0]==1)
   {
      b[0]=0;
      bigmult( a,b,r);
      bigadd(  a,r);

   }
   else
   {
     if(iszero(b))
     {
        for(int i=0;i<10000;i++)
           r[i]=0;
     }
     else
     {
       dropdown(b);
       bigmult(a,b,r);
       bigadd(r,r);
     }
   }
}
// Divides n words in s by f, stores result in d, returns remainder
rawtype basediv (rawtype *dest, rawtype *src1, rawtype src2, size_t len, rawtype carry)
{
    size_t t;
    rawtype tmp[2];

    for (t = 0; t < len; t++)
    {
        tmp[1] = bigmul (tmp, &carry, Base, 1);
        if (src1) bigadd (tmp, src1 + t, 1, 1);
        carry = bigdiv (tmp, tmp, src2, 2);
        dest[t] = tmp[0];
    }

    return carry;
}
Beispiel #12
0
// Returns in r the solution of x == r[k] (mod m[k]), k = 0, ..., n-1
void crt (rawtype *r, rawtype *m, size_t n)
{
    size_t t, k;
    rawtype *mm = new rawtype[n], *x = new rawtype[n], *s = new rawtype[n];
    modint y;
    rawtype o;

    o = modint::modulus;

    mm[0] = m[0];
    for (t = 1; t < n; t++)
        mm[t] = bigmul (mm, mm, m[t], t);

    for (t = 0; t < n; t++)
        s[t] = 0;

    for (k = 0; k < n; k++)
    {
        setmodulus (m[k]);

        y = 1;
        for (t = 0; t < n; t++)
            if (t != k) y *= m[t];

        y = r[k] / y;

        bigdiv (x, mm, m[k], n);
        x[n - 1] = bigmul (x, x, y, n - 1);

        if (bigadd (s, x, n) || bigcmp (s, mm, n) > 0)
            bigsub (s, mm, n);
    }

    moveraw (r, s, n);

    setmodulus (o);

    delete[] mm;
    delete[] x;
    delete[] s;
}
Beispiel #13
0
int main()
{
	SieveOfEratosthenes(Primes, 1000);

	srand(time(NULL));

	char croaks[] = "PPPPNNPPPNPPNPN";

	RunSimulations();

	bignum numerator;
	bigset(numerator, 119);

	bignum denominator;
	bigset(denominator, 300);

	bignum temp1;
	bigset(temp1, 190);

	bignum temp2;
	bigset(temp2, 405);

	bignum temp3;
	biginit(temp3);

	bignum temp4;
	biginit(temp4);

	bignum temp5;
	biginit(temp5);

	int i;

	for(i = 1; i < 15; i++)
	{
		bigmulint(temp3,bigadd(temp3, temp1, temp2), 7695);

		bigsetbig(temp4, temp1);
		bigsetbig(temp5, temp2);

		bigadd(temp1, bigmulint(temp1, temp1, 81), bigmulint(temp5, temp5, 1805));
		bigadd(temp2, bigmulint(temp2, temp2, 5890), bigmulint(temp4, temp4, 7614));

		if(croaks[i] == 'P')
			bigmulint(temp1, temp1, 2);

		else
			bigmulint(temp2, temp2, 2);
			
		bigmul(numerator, numerator, bigadd(temp4, temp1, temp2));
		bigmul(denominator, denominator, bigmulint(temp3,temp3,3));

		char string1[1000];
		char string2[1000];
		biggetstr(string1, numerator);
		biggetstr(string2, denominator);
		printf("%s/%s\n", string1, string2);
	}

	char string1[1000];
	char string2[1000];
	biggetstr(string1, numerator);
	biggetstr(string2, denominator);
	printf("%s/%s\n", string1, string2);

	return 0;
}