Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #define MAX_DIG 32 //maximum digits in any base
- typedef struct {
- int x; //number in base10
- int N; //number of digits
- int b; //base for d
- int d[MAX_DIG]; //digits of a number
- int r; //remainder, d mod(b-1)
- } numb;
- void sum_d(numb* n) //=n.d mod(n.b-1)
- {
- n->r=0;
- for (int i=0; i<n->N; i++) {
- n->r+=n->d[i];
- if(n->r>=n->b) {
- n->r-=(n->b-1);
- }
- }
- if (n->r==n->b-1) n->r=0;
- }
- void to_base(int b, numb* n) //b=2^i, where i=1,2,3,...
- {
- //TODO:convert to baseb more easily
- }
- void gen_numb(int b, int Nd, int x, numb* n) //b=2^i, where i=1,2,3,4,..
- {
- n->N=Nd; //number of digits in base b
- n->b=b;
- int Nb=log2(b); //number of bits per digit in base b
- int i = 0;
- int j = 0;
- for (i=0; i < Nd; i++) {
- n->d[i]=(x & ((b-1) << j)) >> j;
- j+=Nb;
- }
- n->x=x;
- sum_d(n);
- }
- int main(void)
- {
- #define N_VALS 3
- #define N_BASE 5
- const int bx[N_BASE] = {64,32,16,8,4}; //base of x
- const int x[N_VALS] = {791,135727,478};
- const int Nd[N_VALS][N_BASE] = { //Nd for x[i] in all bases
- {2,2,3,4,5},
- {3,4,5,6,9},
- {2,2,3,3,5}
- }; //number of digits in x
- numb n;
- for(int i=0; i<N_VALS; i++) {
- for(int j=0; j<N_BASE; j++) {
- gen_numb(bx[j],Nd[i][j],x[i],&n);
- printf("x=%u,b=%u,r=%u",x[i],bx[j],n.r);
- if (n.r == x[i]%(bx[j]-1)) printf(" ...OK\r\n");
- else printf(" ...FAIL, r=%u\r\n",x[i]%(bx[j]-1));
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment