const GFn_el_t GFn_el_t::operator -() const { GFn_el_t T(GFn); poly_sub(prime, degree, T.comp, -1, NULL, degree, comp); return T; }
GFn_el_t & GFn_el_t::operator -= (const GFn_el_t &_h) { assert( &GFn == &_h.GFn ); poly_sub(prime, degree, comp, degree, comp, degree, _h.comp); return *this; }
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; }
const GFn_el_t GFn_el_t::inv() const { int i; unsigned int u0[degree + 1], r0[degree + 1]; unsigned int u1[degree + 1], r1[degree + 1]; unsigned int q[degree + 1], r[degree + 1]; unsigned int u[2*degree + 1]; { for(i = degree; i >= 0 && 0 == comp[i]; --i) r1[i] = 0; assert( i >= 0 ); if( 0 == i ) return GFn_el_t(GFn, gf_inv(prime, comp[0])); for(; i >= 0; --i) r1[i] = comp[i]; for(i = degree; i >= 1; --i) u1[i] = 0; u1[0] = 1; } { poly_divmod(prime, degree, u0, degree, r0, GFn.degree, GFn.mod, degree, comp); poly_sub(prime, degree, u0, -1, NULL, degree, u0); } while( true ) { { for(i = degree; i >= 0 && 0 == r0[i] ; --i); assert( i >= 0 ); if( 0 == i ) { unsigned int inv = gf_inv(prime, r0[0]); poly_mul(prime, degree, u0, degree, u0, 0, &inv); return GFn_el_t(GFn, u0); } } poly_divmod(prime, degree, q, degree, r, degree, r1, degree, r0); for(i = degree; i >= 0; --i) { r1[i] = r0[i]; r0[i] = r[i]; } poly_mul(prime, 2*degree, u, degree, u0, degree, q); poly_sub(prime, 2*degree, u, degree, u1, 2*degree, u); for( i = degree; i >= 0; --i) u1[i] = u0[i]; poly_divmod(prime, -1, NULL, degree, u0, 2*degree, u, GFn.degree, GFn.mod); } }