예제 #1
0
void _nmod_poly_div_newton(mp_ptr Q, mp_srcptr A, slong lenA, 
                                     mp_srcptr B, slong lenB, nmod_t mod)
{
    const slong lenQ = lenA - lenB + 1;
    mp_ptr Arev, Brev;

    Arev = _nmod_vec_init(2 * lenQ);
    Brev = Arev + lenQ;

    _nmod_poly_reverse(Arev, A + (lenA - lenQ), lenQ, lenQ);

    if (lenB >= lenQ)
    {
        _nmod_poly_reverse(Brev, B + (lenB - lenQ), lenQ, lenQ);
    }
    else
    {
        _nmod_poly_reverse(Brev, B, lenB, lenB);
        flint_mpn_zero(Brev + lenB, lenQ - lenB);
    }

    _nmod_poly_div_series(Q, Arev, Brev, lenQ, mod);

    _nmod_poly_reverse(Q, Q, lenQ, lenQ);

    _nmod_vec_clear(Arev);
}
예제 #2
0
void
_nmod_poly_atan_series(mp_ptr g, mp_srcptr h, long n, nmod_t mod)
{
    mp_ptr t, u;

    t = _nmod_vec_init(n);
    u = _nmod_vec_init(n);

    /* atan(h(x)) = integral(h'(x)/(1+h(x)^2)) */
    _nmod_poly_mullow(u, h, n, h, n, n, mod); u[0] = 1UL;
    _nmod_poly_derivative(t, h, n, mod); t[n-1] = 0UL;
    _nmod_poly_div_series(g, t, u, n, mod);
    _nmod_poly_integral(g, g, n, mod);

    _nmod_vec_free(t);
    _nmod_vec_free(u);
}
예제 #3
0
void
_nmod_poly_tanh_series(mp_ptr f, mp_srcptr h, long n, nmod_t mod)
{
    mp_ptr t, u;

    t = _nmod_vec_init(n);
    u = _nmod_vec_init(n);

    _nmod_vec_add(t, h, h, n, mod);
    _nmod_poly_exp_series(u, t, n, mod);
    _nmod_vec_set(t, u, n);
    t[0] = 0UL;
    u[0] = 2UL;
    _nmod_poly_div_series(f, t, u, n, mod);

    _nmod_vec_free(t);
    _nmod_vec_free(u);
}