Exemple #1
0
void newhope_sharedb(unsigned char *sharedkey, unsigned char *send, const unsigned char *received)
{
  poly sp, ep, v, a, pka, c, epp, bp;
  unsigned char seed[NEWHOPE_SEEDBYTES];
  unsigned char noiseseed[32];
  
  randombytes(noiseseed, 32);

  decode_a(&pka, seed, received);
  gen_a(&a, seed);

  poly_getnoise(&sp,noiseseed,0);
  poly_ntt(&sp);
  poly_getnoise(&ep,noiseseed,1);
  poly_ntt(&ep);

  poly_pointwise(&bp, &a, &sp);
  poly_add(&bp, &bp, &ep);
  
  poly_pointwise(&v, &pka, &sp);
  poly_bitrev(&v);
  poly_invntt(&v);

  poly_getnoise(&epp,noiseseed,2);
  poly_add(&v, &v, &epp);

  helprec(&c, &v, noiseseed, 3);

  encode_b(send, &bp, &c);
  
  rec(sharedkey, &v, &c);

  sha3256(sharedkey, sharedkey, 32);
}
void poly_multiple(int startA,int endA,int startB,int endB,int *avail,int *avail_end) //多項式乘法 
{
	int i, j, n;
	
	for(i=0;startA+i <= endA;i++){ //算出乘法項  
        for(j=0;startB+j <= endB;j++,(*avail)++){
	        p[*avail].coef = p[startA+i].coef * p[startB+j].coef;
		    p[*avail].expon = p[startA+i].expon + p[startB+j].expon;
        }
        if(i==1){ //相加前兩項乘法項
            poly_add(*avail-j*2,*avail-j-1,*avail-j,*avail-1,avail,avail_end);
            n = *avail_end - *avail;
            *avail = *avail_end;
        }
        if(i>1){  //相加前一項乘法項與後一項相加後乘法項 
            poly_add(*avail-j-n,*avail-j-1,*avail-j,*avail-1,avail,avail_end);
            n = *avail_end - *avail;
            *avail = *avail_end;
        }
	}
	*avail-=n;
	for(i=0;(*avail)+i < *avail_end;i++){ //印出結果 
        if(i!=0)printf(" + ");
		    printf("%g",p[*avail_end-n+i].coef);
		if(p[*avail_end-n+i].expon != 0)
			printf("X^%u\n",p[*avail_end-n+i].expon);
    }
    
}
Exemple #3
0
static void berlekamp_massey(const uint8_t *s, int N,
			     const struct galois_field *gf,
			     uint8_t *sigma)
{
	uint8_t C[MAX_POLY];
	uint8_t B[MAX_POLY];
	int L = 0;
	int m = 1;
	uint8_t b = 1;
	int n;

	memset(B, 0, sizeof(B));
	memset(C, 0, sizeof(C));
	B[0] = 1;
	C[0] = 1;

	for (n = 0; n < N; n++) {
		uint8_t d = s[n];
		uint8_t mult;
		int i;

		for (i = 1; i <= L; i++) {
			if (!(C[i] && s[n - i]))
				continue;

			d ^= gf->exp[(gf->log[C[i]] +
				      gf->log[s[n - i]]) %
				     gf->p];
		}

		mult = gf->exp[(gf->p - gf->log[b] + gf->log[d]) % gf->p];

		if (!d) {
			m++;
		} else if (L * 2 <= n) {
			uint8_t T[MAX_POLY];

			memcpy(T, C, sizeof(T));
			poly_add(C, B, mult, m, gf);
			memcpy(B, T, sizeof(B));
			L = n + 1 - L;
			b = d;
			m = 1;
		} else {
			poly_add(C, B, mult, m, gf);
			m++;
		}
	}

	memcpy(sigma, C, MAX_POLY);
}
Exemple #4
0
void poly_mul(node **Hpoly1,node **Hpoly2,node **Hpoly3)
{
	node *temp1,*temp2,*temp31,*temp32;

	if(*Hpoly1==NULL)
		*Hpoly3=*Hpoly2;
	else if(*Hpoly2==NULL)
		*Hpoly3=*Hpoly1;

	temp31=(node*)malloc(sizeof(node));
	temp31->next=NULL;

	for(temp1=*Hpoly1;temp1!=NULL;temp1=temp1->next)
	{
		for(temp2=*Hpoly2;temp2!=NULL;temp2=temp2->next)
		{
			temp31->coeff=temp1->coeff*temp2->coeff;
			temp31->expn=temp1->expn+temp2->expn;
			temp32=*Hpoly3;
			*Hpoly3=NULL;
			poly_add(&temp32,&temp31,&*Hpoly3);
			poly_reverse(&*Hpoly3);
		}
	}
}
void main()
{
	char opt;
	clrscr();
	printf("\nCreate the first list\n");
	do
	{
		creat(&x1);
		printf("\nPress 'y' to continue");
		flushall();
		scanf("%c",&opt);
	}while(opt=='y');

	printf("\nCreate the second list\n");
	do
	{
		creat(&x2);
		printf("\nPress 'y' to continue");
		flushall();
		scanf("%c",&opt);
	}while(opt=='y');
	getch();
	clrscr();
	printf("\n\nElements in list1\n\n");
	traverse(&x1);
	printf("\n\nElements in list2\n\n");
	traverse(&x2);
	printf("\n\n\n After addition\n\n");
	x3=poly_add(x1,x2);
	traverse(&x3);
	printf("\n\n\n After multiplication\n\n");
	x4=poly_mul(x1,x2);
	traverse(&x4);
	getch();
}
Exemple #6
0
GFn_el_t & GFn_el_t::operator += (const GFn_el_t &_h) {

    assert( &GFn == &_h.GFn );

    poly_add(prime, degree, comp, degree, comp, degree, _h.comp);

    return *this;
}
int main(void)
{
	FILE *fp;
	int i;
	int startA = 0, endA, startB, endB, startD, avail, avail_end;

	memset(p,0,MAX_TERM);//把 p[MAX_TERM]全陣列初始化為0

	fp = fopen("poly_a.txt","r");//讀取poly_a.txt並印出-------------------------------
	if(fp==NULL)printf("開檔失敗");
	printf("A(x) = ");
	for(i=0;!feof(fp);i++){
		if(i!=0)printf(" + ");
		    fscanf(fp,"%f\t%u\n",&p[startA+i].coef,&p[startA+i].expon);
		    printf("%g",p[startA+i].coef);
		if(p[startA+i].expon != 0)
			printf("X^%u",p[startA+i].expon);
	}
	printf("\n");
	fclose(fp);//關閉poly_a.txt-------------------------------------------------------

	endA = startA+i-1;
	startB = endA+1;
	printf("\nB(x) = ");
	fp = fopen("poly_b.txt","r");//讀取poly_b.txt並印出-------------------------------
	if(fp==NULL)printf("開檔失敗");
	for(i=0;!feof(fp);i++){
		if(i!=0)printf(" + ");
		    fscanf(fp,"%f\t%u\n",&p[startB+i].coef,&p[startB+i].expon);
		    printf("%g",p[startB+i].coef);
		if(p[startB+i].expon != 0)
			printf("X^%u",p[startB+i].expon);
	}
	printf("\n");
	fclose(fp);//關閉poly_b.txt-------------------------------------------------------

	endB = startB+i-1;
	startD = endB+1;
	
	poly_add(startA,endA,startB,endB,&startD,&avail);
	printf("\nA(x) + B(x) = ");
	for(i=0;p[startD+i].coef!=0;i++){
		if(i!=0)printf(" + ");
		    printf("%g",p[startD+i].coef);
		if(p[startD+i].expon != 0)
			printf("X^%u",p[startD+i].expon);
	}
	printf("\n");
	printf("\n[A(x) + B(x)] * B(x) = \n");
    poly_multiple(startD,avail-1,startB,endB,&avail,&avail_end);
    printf("\nX = 3.14 : %f\n",substitute(avail,avail_end));
    system("pause");
	return 0;
}
Exemple #8
0
Poly *poly_multi(Poly *poly1, Poly *poly2)
{
	Poly *retPoly, *tmpM, *tmpA;
	// to ensure that no memory leaking during the operation, we use two temporary pointers for memory management purposes
	// tmpM is used to track the poly object during multiplication
	// tmpA is used to track the poly object during addition
	Term *iter;
	retPoly = poly_new();
	for (iter = poly2->head; iter != NULL; iter = iter->next)
	{
		tmpM = poly_term_multi(poly1, iter);
		tmpA = retPoly;
		retPoly = poly_add(retPoly, tmpM);
		poly_destroy(tmpM);
		poly_destroy(tmpA);
	}
	return retPoly;
}
Exemple #9
0
void newhope_keygen(unsigned char *send, poly *sk)
{
  poly a, e, r, pk;
  unsigned char seed[NEWHOPE_SEEDBYTES];
  unsigned char noiseseed[32];

  randombytes(seed, NEWHOPE_SEEDBYTES);
  randombytes(noiseseed, 32);

  gen_a(&a, seed); //unsigned

  poly_getnoise(sk,noiseseed,0);
  poly_ntt(sk); //unsigned
  
  poly_getnoise(&e,noiseseed,1);
  poly_ntt(&e); //unsigned

  poly_pointwise(&r,sk,&a); //unsigned
  poly_add(&pk,&e,&r); //unsigned
  encode_a(send, &pk, seed);
}
Exemple #10
0
void main()
{
  NODE head1,head2,head3;
  MALLOC(head1,1,struct node);
  MALLOC(head2,1,struct node);
  MALLOC(head3,1,struct node);
  head1->link=head1;
  head2->link=head2;
  head3->link=head3;
  printf("enter the first polynomial\n");
  head1=read_polynomial(head1);
  printf("enter the second polynomial\n");
  head2=read_polynomial(head2);
  head3=poly_add(head1,head2,head3);
  printf("polynomial 1:");
  display(head1);
  printf("\npolynomial 2:");
  display(head2);
  printf("\npolynomial 3:");
  display(head3);
  getch();
}
Exemple #11
0
main()
{
	ListHeader list1, list2, list3;
		
	init(&list1);
	init(&list2);
	init(&list3);


	// 다항식 1을 생성 
	insert_node_last(&list1, 3,12);
	insert_node_last(&list1, 2,8);
	insert_node_last(&list1, 1,0);

	// 다항식 2를 생성 
	insert_node_last(&list2, 8,12);
	insert_node_last(&list2, -3,10);
	insert_node_last(&list2, 10,6);

	// 다항식 3 = 다항식 1 + 다항식 2
	poly_add(&list1, &list2, &list3);
	poly_print(&list3);
}
Exemple #12
0
main( )
{
	struct node *p1_start,*p2_start,*p3_start;

	p1_start=NULL;
	p2_start=NULL;
	p3_start=NULL;

	printf("Polynomial 1 :\n");
	p1_start=enter(p1_start);

	printf("Polynomial 2 :\n");
	p2_start=enter(p2_start);

	p3_start=poly_add(p1_start,p2_start);

	printf("Polynomial 1 is :  ");
	display(p1_start);
	printf("Polynomial 2 is :  ");
	display(p2_start);
	printf("Added polynomial is :  ");
	display(p3_start);
}/*End of main()*/
Exemple #13
0
int main( )
{
    struct polynode *first, *second, *total ;
    int i = 0 ;

    first = second = total = NULL ;  /* empty linked lists */

    poly_append ( &first, 1.4f, 5 ) ;
    poly_append ( &first, 1.5f, 4 ) ;
    poly_append ( &first, 1.7f, 2 ) ;
    poly_append ( &first, 1.8f, 1 ) ;
    poly_append ( &first, 1.9f, 0 ) ;

    system ( "cls" ) ;

    display_poly ( first ) ;

    poly_append ( &second, 1.5f, 6 ) ;
    poly_append ( &second, 2.5f, 5 ) ;
    poly_append ( &second, -3.5f, 4 ) ;
    poly_append ( &second, 4.5f, 3 ) ;
    poly_append ( &second, 6.5f, 1 ) ;

    printf ( "\n\n" ) ;
    display_poly ( second ) ;

    /* draws a dashed horizontal line */
    printf ( "\n" ) ;
    while ( i++ < 79 )
        printf ( "-" ) ;
    printf ( "\n\n" ) ;

    poly_add ( first, second, &total ) ;
    display_poly ( total ) ;  /* displays the resultant polynomial */
    return 0 ;
}
Exemple #14
0
int poly_binary_parse(poly_data *cd, char *filename, float scale)
{
    FILE *fp = fopen(filename, "rb");
    if(fp == NULL) {
        return 1;
    }
    float delta, val;
    uint32_t nvals;
    uint32_t n;
    while(1){

        fread(&delta, sizeof(float), 1, fp);

        if(feof(fp)){
            break;
        }
#ifdef POLY_DEBUG
        printf("reading delta value of %g\n", delta);
#endif
        fread(&nvals, sizeof(uint32_t), 1, fp);
#ifdef POLY_DEBUG
        printf("reading %d nvals\n", nvals);
#endif
        poly_add(cd, (uint32_t) scale * delta, nvals);
        for(n = 0; n < nvals; n++) {
            fread(&val, sizeof(float), 1, fp);
#ifdef POLY_DEBUG
            printf("---- reading %g\n", val);
#endif
            poly_pset(cd, n, val);
        }

    }
    fclose(fp);
    return 0;
}
int main (void) {

   poly *P0, *P1, *P2, *P3, *M1, *M2, *P4, *P5, *P6, *P7;

   P0=poly_create(4,2,1,3,2,6,5,1,7); //4 terms: 1x^7 + 6x^5 + 3x^2 + 2x^1
   P1=poly_create(3,3,2,1,4,6,5);     //3 terms: 6x^5 + 1x^4 + 3x^2
   P2=poly_create(1,16,2);            //1 term:  16x^2
   P3=poly_create(0);                 // no terms

   printf("P0: "); poly_print(P0);
   printf("P1: "); poly_print(P1);
   printf("P2: "); poly_print(P2);
   printf("P3: "); poly_print(P3);

   M1=poly_scalar_mult(P1,2);
   printf("M1 (P1*2): "); poly_print(M1);

   M2=poly_scalar_mult(P3,4);
   printf("M2 (P3*4): "); poly_print(M2);

   P4=poly_duplicate(M1);
   printf("P4 (dup M1): "); poly_print(P4);

   P5=poly_add(P1,P0);
   printf("P5 (P1+P0): "); poly_print(P5);

   P6=poly_add(P3,P3);
   printf("P6 (P3+P3): "); poly_print(P6); 

   P7=poly_add(P0,P3);
   printf("P7 (P0+P3): "); poly_print(P7);

   poly_free(&P1);
   if (P1==NULL) printf("P1: was freed\n");
   else          printf("P1: is not null!!\n");
   
   
   
   poly *test1=poly_create(4,2,1,3,2,6,5,1,7); //4 terms: 1x^7 + 6x^5 + 3x^2 + 2x^1

   poly *test2=poly_duplicate(test1);
   test2=poly_scalar_mult(test2, 5);

   printf("test1: ");poly_print(test1);
   printf("test2: ");poly_print(test2);

   //printf("%p, %p\n", test1, test2);
   poly_free(&test1);

   poly *MM1 = poly_create(5,1,1,2,2,3,3,4,4,5,5);
   poly *MM2 = poly_create(5,-1,1,-2,2,-3,3,-4,4,-5,5);

   printf("MM1: ");poly_print(MM1);
   printf("MM2: ");poly_print(MM2);


   poly *MM1_Plus_MM2 = poly_add(MM1, MM2);
   printf("(MM1+MM2): ");poly_print(MM1_Plus_MM2);

   poly *MM1_Multiplied_By_5 = poly_scalar_mult(MM1, 5);
   poly *MM2_Multiplied_By_10 = poly_scalar_mult(MM2, 10);

   printf("MM1*5: ");poly_print(MM1_Multiplied_By_5);
   printf("MM2*10: ");poly_print(MM2_Multiplied_By_10);
   printf("MM1: ");poly_print(MM1);
   printf("MM2: ");poly_print(MM2);

}
Exemple #16
0
void gui_add_vertex (gui *g, int x, int y) {
  poly_add (g->poly, vertex_new (x, y));
  gui_draw_all (g);
}
int main(void)
{
    DList listhdr1, listhdr2, listhdr3, listhdr4;
    int coef, expon;
    
    initList(&listhdr1);
    initList(&listhdr2);
    initList(&listhdr3);
    initList(&listhdr4);
    
    //다항식 p(x) 입력
    printf("다항식 p(x)의 계수, 차수 쌍을 입력하세요. 끝이면 0 0을 입력하세요. \n");
    while(1){ 
         scanf("%d %d", &coef, &expon);
         if(coef==0){
              if(expon!=0)
                   printf("계수가 0인 값은 입력 할 필요가 없습니다! \n"); 
              else
                   break;
         }
         else
              insert_node(&listhdr1, coef, expon);
    }
    poly_sort(&listhdr1);            //p(x) 내림차순 정렬 
    poly_dup(&listhdr1);             //p(x) 중복 차수 제거 
    fflush(stdin);                   //입력 버퍼 비우기(입력값 오류 방지) 
    
    //다항식 q(x) 입력 
    printf("다항식 q(x)의 계수, 차수 쌍을 입력하세요. 끝이면 0 0을 입력하세요. \n");
    while(1){      
         scanf("%d %d", &coef, &expon); 
         if(coef==0){
              if(expon!=0)
                   printf("계수가 0인 값은 입력 할 필요가 없습니다! \n"); 
              else
                   break;
         }
         else
              insert_node(&listhdr2, coef, expon);
    }
    poly_sort(&listhdr2);            //q(x) 내림차순 정렬 
    poly_dup(&listhdr2);             //q(x) 중복 차수 제거 
    fflush(stdin);                   //입력 버퍼 비우기(입력값 오류 방지)
    
    poly_add(&listhdr1, &listhdr2, &listhdr3);
    poly_sub(&listhdr1, &listhdr2, &listhdr4);
    
    printf("**************** Input value ****************\n");
    printf("p(x)=");
    poly_print(&listhdr1);
    printf("\n");
    printf("q(x)=");
    poly_print(&listhdr2);
    printf("\n");
    printf("****************    Result   ****************\n");
    printf("p(x)+q(x)=");
    poly_print(&listhdr3);
    printf("\n");
    printf("p(x)-q(x)=");
    poly_print(&listhdr4);
    printf("\n");
    
    system("pause");
    return 0;
}