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); } }
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); }
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(); }
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; }
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; }
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); }
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(); }
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); }
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()*/
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 ; }
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); }
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; }