Пример #1
0
/*
coeffs: coefficients
solve: RHS
1. Divide through by GCD(coeffs) (sol to coprime equation = sol to original)
2. Solve babby diophantine to get top left corner = solve/gcd
*/
void dio(int coeffs[], int vars, int solve, int matrix[vars][vars+1] ){
	if(1){
		printf("Valid!\n");
		int geeceedee = lgcd(coeffs,vars);
		if( solve % geeceedee == 0 ){
			printf("Solutions!\n");
			int i;
			int coprimes[vars];
			for(i=0; i<vars; i++){//coeffs NOW COPRIME. NOW SOLVING FOR solve/geeceedee
				coprimes[i]=coeffs[i]/geeceedee;
				matrix[i][0]=coprimes[i];
			}
			for(i=0; i<vars; i++){//1s n 0s
				int j;
				for(j=1; j<vars+1; j++)
					matrix[i][j] = (j==i+1) ? 1 : 0;
			}
			//SOLVING SHIT (COPRIME MATRIX)//
			int g=1;
			i=1;
			while((solve/geeceedee) % gcd(coprimes[0],coprimes[i]) != 0){//finds coeff[i]: coeff[0]x + coeff[i]y=solve has sol
				i++;
			}
			g=i;
			int d=(solve/geeceedee)/gcd(coprimes[0], coprimes[g]/geeceedee);
			int u, v;
			bezout(coprimes[0], coprimes[g],&u,&v);
			u *= d;//coeff[0]u + gv = solve;
			v *= d;
			for(i=0; i<vars+1; i++)//puts solve in top corner
				matrix[0][i] = (u*matrix[0][i]) + (v*matrix[g][i]);
			for(i=1; i<vars; i++){//elim row with top row
				int j;
				int fact = lcm(coprimes[i], matrix[0][0]);
				for(j=0; j<vars+1; j++){
					matrix[i][j] = (fact/coprimes[i])*matrix[i][j] -  (fact/matrix[0][0])*matrix[0][j];
				}
			}
		}
		//No Solution
		else{
			printf("No solution!\n");
		}
	}
	//Bad input
	else{
		printf("Bad input!\n");
	}
}
Пример #2
0
long long lgcd (long long a,long long b )
{
  if ( a==0 ) return b;
  return lgcd ( b%a, a );
}
Пример #3
0
PIO_Offset GCDblocksize(const int arrlen, const PIO_Offset arr_in[]){
  //  PIO_Offset del_arr[arrlen-1];
  // PIO_Offset loc_arr[arrlen-1];
  PIO_Offset *gaps=NULL;
  PIO_Offset *blk_len=NULL;
  int i, j, k, n, numblks, numtimes, ii, numgaps;
  PIO_Offset bsize, bsizeg, blklensum;
  //  PIO_Offset *del_arr = (PIO_Offset *) calloc((arrlen-1),sizeof(PIO_Offset));
  // PIO_Offset *loc_arr = (PIO_Offset *) calloc((arrlen-1),sizeof(PIO_Offset));
  PIO_Offset del_arr[arrlen-1];
  PIO_Offset loc_arr[arrlen-1];

  // printf("%s %d\n",__FILE__,__LINE__);

  numblks=0;
  numgaps=0;
  numtimes=0;

  for(i=0;i<arrlen-1;i++){
    del_arr[i] = arr_in[i+1] - arr_in[i];
    if(del_arr[i] != 1){
      numtimes++;
      if(i>0 && del_arr[i-1]>1){
	return(1);
      }
      //      printf("%s %d %d %d %d\n",__FILE__,__LINE__,i,del_arr[i],arr_in[i]);

    }
  }



  numblks = numtimes+1;
  if(numtimes==0)
    n = numblks;
  else
    n = numtimes;

  //    printf("%s %d %d %d\n",__FILE__,__LINE__,numblks,numtimes);
  bsize = (PIO_Offset) arrlen;
  if(numblks>1){
    PIO_Offset blk_len[numblks];
    PIO_Offset gaps[numtimes];
    //    blk_len =  (PIO_Offset*) calloc(numblks,sizeof(PIO_Offset));
    //  loc_arr = (PIO_Offset*) malloc((arrlen-1)*sizeof(PIO_Offset));
    //printf("%s %d %d\n",__FILE__,__LINE__,numtimes);
    if(numtimes>0){
      //      gaps = (PIO_Offset *) calloc(numtimes,sizeof(PIO_Offset));
      ii=0;
      // printf("%s %d %d\n",__FILE__,__LINE__,arrlen);
      for(i=0;i<arrlen-1;i++){
	if(del_arr[i]>1)
	  gaps[ii++] = del_arr[i] - 1;
      }
      numgaps=ii;
    }
    // printf("%s %d\n",__FILE__,__LINE__);

    j=0;
    for(i=0;i<n;i++)
      loc_arr[i]=1;
    for(i=0;i<arrlen-1;i++){
      if(del_arr[i] != 1)
	loc_arr[ j++ ]  = i;
    }
    // printf("%s %d\n",__FILE__,__LINE__);

    blk_len[0] = loc_arr[0];
    blklensum=blk_len[0];
    for(i=1;i<numblks-1;i++){
      blk_len[i] = loc_arr[i] - loc_arr[i-1];
      blklensum+= blk_len[i];
    }
    blk_len[numblks-1] = arrlen - blklensum;

    bsize = lgcd_array(numblks, blk_len);
    if(numgaps > 0) {
      bsizeg = lgcd_array(numgaps, gaps);
      bsize = lgcd(bsize,bsizeg);
      //   free(gaps);
    }
    if(arr_in[0]>0)
      bsize = lgcd(bsize,arr_in[0]);
    //   printf("%s %d\n",__FILE__,__LINE__);

    //  free(loc_arr);
    // free(del_arr);
    // free(blk_len);
  }
  //  printf("%s %d\n",__FILE__,__LINE__);
  return bsize;
}