Доказательство алгоритма вычисление многочлена
От: Stgl  
Дата: 01.03.15 17:45
Оценка:
Есть многочлен P(x) = a n * x n + a n — 1 * x n — 1 + ... + a 1 * x + a 0
Есть псевдокод, вычисляющий этот многочлен:
function horner(A, x)
    p = A n
    for i from n - 1 to 0
        p = p * x + A i
    return p

Нужно доказать правильность этого алгоритма.
Я делаю это так: инвариант цикла будет (P = P * x + A i) and (n — 1 >= i >= 0). Инвариант будет истинным перед каждой итерацией. Условие завершение цикла i < 0, что у нас в коде достигается. Так как инвариант и условие завершение цикла истинны, то наш код правильный.
Здесь есть ошибки?
Отредактировано 01.03.2015 19:42 Stgl . Предыдущая версия .
Re: Доказательство алгоритма вычисление многочлена
От: Кодт Россия  
Дата: 01.03.15 23:48
Оценка:
Здравствуйте, Stgl, Вы писали:

S>Я делаю это так: инвариант цикла будет (P = P * x + A i) and (n — 1 >= i >= 0). Инвариант будет истинным перед каждой итерацией. Условие завершение цикла i < 0, что у нас в коде достигается. Так как инвариант и условие завершение цикла истинны, то наш код правильный.

S>Здесь есть ошибки?

Инвариант записан как-то странно: P = P*x+Ai. Это что, уравнение такое? По переменной x? Поиск неподвижной точки?

Говоря о схеме Горнера, есть смысл перейти к последовательности многочленов
P(x) = SUMi=0..n ai*xi
P(x) = P0(x)
Pi(x) = Pi+1(x)*x + ai
Pn+1(x) = 0
ну, или начать с
Pn(x) = 0*x + an

или, соответственно, к последовательности значений bi этих многочленов для данного аргумента x
P(x) = b0
Pi(x) = bi = bi+1*x+ai
bn+1 = 0
bn = 0*x + an = an

Тогда надо будет лишь показать, что на i-й итерации цикла (где итерации нумеруются от n до 0 по убыванию) на входе bi+1, на выходе bi
В данном случае всё тривиально. Просто по определению.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.