Example #1
0
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;
}
Example #2
0
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;
}
Example #4
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);
    }
}