/* 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"); } }
long long lgcd (long long a,long long b ) { if ( a==0 ) return b; return lgcd ( b%a, a ); }
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; }