Алгоритм Юна

Я хотел бы попробовать реализовать алгоритм Юна для бесквадратной факторизации многочленов. Из Википедии (f - это полином):

a0 = gcd(f, f'); b1 = f/a0; c1 = f'/a0; d1 = c1 - b1'; i = 1
repeat
ai = gcd(bi, di); bi+1 = bi/ai; ci+1 = di/ai; i = i + 1; di = ci - bi'
until b = 1

однако я не уверен насчет второго шага. Я хотел бы использовать его для многочленов с целочисленными коэффициентами (не обязательно моническими или примитивными). Возможно ли реализовать разделение b1 = f/a0 используя только целые числа?

я нашел код синтетические раздел:

def extended_synthetic_division(dividend, divisor):
    '''Fast polynomial division by using Extended Synthetic Division. Also works with non-monic polynomials.'''
    # dividend and divisor are both polynomials, which are here simply lists of coefficients. Eg: x^2 + 3x + 5 will be represented as [1, 3, 5]

    out = list(dividend) # Copy the dividend
    normalizer = divisor[0]
    for i in xrange(len(dividend)-(len(divisor)-1)):
        out[i] /= normalizer # for general polynomial division (when polynomials are non-monic),
                             # we need to normalize by dividing the coefficient with the divisor's first coefficient
        coef = out[i]
        if coef != 0: # useless to multiply if coef is 0
            for j in xrange(1, len(divisor)): # in synthetic division, we always skip the first coefficient of the divisor,
                                              # because it is only used to normalize the dividend coefficients
                out[i + j] += -divisor[j] * coef

    # The resulting out contains both the quotient and the remainder, the remainder being the size of the divisor (the remainder
    # has necessarily the same degree as the divisor since it is what we couldn't divide from the dividend), so we compute the index
    # where this separation is, and return the quotient and remainder.
    separator = -(len(divisor)-1)
    return out[:separator], out[separator:] # return quotient, remainder.

проблема для меня в том, что out[i] /= normalizer. Это всегда работа с целым (пол) отдел по ? Это так, что всегда можно разделить f/gcd(f, f')? Это out[separator:] (остаток) всегда идет к нулю?

1 ответов


тот факт, что "дивизии в p/GCD(p, p') всегда будет работать (т. е. быть "точным", без остатка в Z)" следует из определения GCD. Для любых многочленов p и q их GCD(p,q) делит как p и q точно. Вот почему он называется GCD то есть максимальный Общий Делитель:

A наибольший общий делитель of p и q - это полином d что делит p и q и такой, что каждый общий делитель p и q деление d.

п. с. Это имеет смысл задавать такие чисто математические вопросы на более специализированных https://math.stackexchange.com/