long* mult(long* ele1, long* ele2, long index) { int i,m,pow; long *ele3=emptyElement(index); for(i=0;i<getDeg(index);i++) //current power of ele 1 { for(m=0;m<getDeg(index);m++) //current power of ele 2 { pow=modDeg(i+m,index); //calculate the new power of the product ele3[pow]=mod(ele3[pow]+ele1[i]*ele2[m],index); } } return ele3; }
/*generate empty Element*/ long* emptyElement(long index) { long *elem; int i=0; if( NULL ==(elem = malloc(getDeg(index)*sizeof(long))) ) //allocate required memory for the ring {printf("not enough memory to generate Ring\n"); //if not enough memory is available prompt error return (long*) -1; } for(i=0;i<getDeg(index);i++) //generate a random number for every parameter { elem[i]=0; } return elem; }
/*misc functions*/ void printEle(long* ele ,long index) { int i=0; for (i=0;i<getDeg(index);i++) { printf("%d ",ele[i]); } }
long* sub(long* ele1, long* ele2, long index) { int i=0; long *ele3=emptyElement(index); for(i=0;i<getDeg(index);i++) { ele3[i]=mod(ele1[i]-ele2[i]+getQ(index),index); } return ele3; }
long* randNormElement(long index) { long *elem; int i=0; float u,v,test; //variables needed to generate normal distribution if( NULL ==(elem = malloc(getDeg(index)*sizeof(long))) ) //allocate required memory for the ring {printf("not enough memory to generate Ring\n"); //if not enough memory is available prompt error return (long*) -1; } for(i=0;i<getDeg(index);i++) //generate a random number for every parameter { u=(float)rand()/RAND_MAX; v=(float)rand()/RAND_MAX; test=(sqrt(-2*log(u))*cos(TWO_PI*v)); test=round(test*getQ(index)+0.5); //discretesize values elem[i]=mod(test+getQ(index)*3,index); //adding 3 times the modulus to the number to make sure that it isnt negative } return elem; }
void addShot(int x, int y, int ox, int oy, int color) { int i, d, ds; Shot *st; for ( i=0 ; i<SHOT_MAX ; i++ ) { shotIdx--; if ( shotIdx < 0 ) shotIdx = SHOT_MAX-1; if ( shot[shotIdx].cnt < 0 ) break; } if ( i >= SHOT_MAX ) return; st = &(shot[shotIdx]); st->x = (float)x/FIELD_SCREEN_RATIO; st->y = -(float)y/FIELD_SCREEN_RATIO; d = getDeg(-ox, oy); ds = getDistance(ox, oy); st->mx = -(float)sctbl[d] *SHOT_SPEED/(FIELD_SCREEN_RATIO*256); st->my = (float)sctbl[d+256]*SHOT_SPEED/(FIELD_SCREEN_RATIO*256); st->d = (float)d*360/1024; st->color = color; st->cnt = ds/SHOT_SPEED; st->width = 0.07; st->height = 0.1; }