LINUX.ORG.RU

как статически доказать эквивалентость двух произвольных алгоритмов

 


2

2

Под эквивалентностью я подразумеваю равенство выходных данных и произведенных побочных эффектов

Например, для двух функций вычислений n-го числа фибоначчи (питон)


def fib1(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

def fib2(n):
    if n < 2:
        return n
    return fib2(n-1) + fib2(n-2)

как доказать что соотношения множеств входных и выходных данных для этих функций одинаковы (не учитывая переполнение стека для второй) ?

Питон тут для примера, для какого-нибудь лиспа, наверное, проще будет сделать это


Ответ на: комментарий от dikiy

Да, верхняя граница погрешности для этих чисел одинакова.

Что и требовалось доказать. Чувак, бросай программирование и иди в дворники.

anonymous
()
Ответ на: комментарий от anonymous

Да, верхняя граница погрешности для этих чисел одинакова.

Что и требовалось доказать.

дык никто и не спорил с этим o_O ты дурашка?

Чувак, бросай программирование и иди в дворники.

да я им и не занимался никогда %) вон, как анонимусам мозги набекрень от него вывернуло.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от dikiy

Относятся просто к разделу численной методов. Этот раздел занимает объем в две лекции. Там нечего собсно учить.

ты собственно ничего про это и не знаешь. Т.ч. твои рассуждения попросту безосновательны.

emulek
()
Ответ на: комментарий от dikiy

А вот доказательство включает в себя ещё и бесконечные алгоритмы, которые ТСу не нужны. Значит и доказательство ему не подходит.

подходит. Это значит, что нельзя создать анализатор даже на конечных алгоритмах.

жду с нетерпением доказательство для подмножества конечных вычислителей.

emulek
()
Ответ на: комментарий от dikiy

численные методы — часть теории чисел. Да, совсем другое.

ты упоролся?

нет. Просто знаю чуть более, чем две лекции.

emulek
()
Ответ на: комментарий от anonymous

Слушай, ну не позорься, а. Тебе правильно говорили, что погрешность float операций через «эпсилон» не выразить.

можно, если эпсилон — случайное число с известным распределением и диапазоном. А если это просто какое-то число, равное(к примеру) IRL скажем 1e-8, то да — нельзя.

В который раз захожу на лор, только чтобы убедиться в том, что громче всех слышно самодовольных идиотов.

остальным нечего сказать очевидно.

emulek
()
Ответ на: комментарий от anonimous

Почему ты считаешь, что это конечный алгоритм?

потому что это конечный алгоритм. С бесконечным(в идеале) временем работы.

Твой алгоритм эквивалентен бесконечной рекурсии, имхо.

всё верно. А ещё он ВНЕЗАПНО эквивалентен пустому оператору, который ничего не делает. Потому что результат его работы эквивалентен. А число времени на служебные операции считать не нужно(в идеале их и нет). Потому этот алгоритм вполне конечен, и его можно попросту вычеркнуть.

Сам посуди, два алгоритма:

1. y=x

2. y=x+0+0+...+0 (100500 раз +0)

ведь очевидно, что (1) эквивалентно (2), несмотря на то, что (2) выполняется намного дольше.

Также очевидно, что и

3.

for(y=x; true;)
  y+=0;
тоже эквивалентен (1) и (2).

emulek
()
Ответ на: комментарий от dikiy

выразить. читаем стандарт IEEE и видим там, что eps для double равен 1.11e-16.

увы. Это не «равен», а не более чем. Про то, что такое «верхняя граница» слышал?

в стандарте есть верхняя граница ошибки.

есть. Но её нельзя прямо так взять, и подставить в свои формулы. Как нельзя сказать, что «монетка упала орлом на половину». И нельзя сказать, что «монетка упадёт орлом». Можно сказать только «в этот раз монетка упала орлом».

Также и с погрешностью — можно сказать лишь «в этот раз 3/3 равно (float)1».

emulek
()
Ответ на: комментарий от anonymous

По-твоему погрешность для чисел порядка 1e10 и порядка 1e-10 одинакова?

именно так. Изучи разницу между абсолютной и относительной погрешностью. Твой оппонент про вторую, а ты про первую.

(это было в первой лекции, во второй рассказано, что так оно только для сложения)

emulek
()
Ответ на: комментарий от emulek

выразить. читаем стандарт IEEE и видим там, что eps для double равен 1.11e-16.

увы. Это не «равен», а не более чем.

этого достаточно.

Про то, что такое «верхняя граница» слышал?

Меня уже на ЛОРе заебали своими высокомерными утверждениями, когда сами в материале плавают баттерфляем.

в стандарте есть верхняя граница ошибки.

есть. Но её нельзя прямо так взять, и подставить в свои формулы.

да запросто можно. И нужно.

dikiy ★★☆☆☆
()
Ответ на: комментарий от emulek

численные методы — часть теории чисел. Да, совсем другое.

ты упоролся?

нет. Просто знаю чуть более, чем две лекции.

походу нет, раз так утверждаешь. Численные методы к теории чисел вообще почти что не относятся.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

да запросто можно. И нужно.

ок. Ты уже попробовал сложить Over9000 чисел от 0 до 1? И сколько получилось?

Не торопись с ответом, подумай и попробуй. И тогда поймёшь, что твой эпсилон можно только складывать(пару раз). И что он ломается даже при умножении на целую константу.

Я уж молчу, что получится, при умножении одного числа с погрешностью, на другое число тоже с погрешностью.

emulek
()
Ответ на: комментарий от dikiy

Численные методы к теории чисел вообще почти что не относятся.

да, пока речь идёт о двух червивых яблоках, хватает и арифметики.

emulek
()
Ответ на: комментарий от emulek

Численные методы к теории чисел вообще почти что не относятся.

да, пока речь идёт о двух червивых яблоках, хватает и арифметики.

ладно. можно по другому попробовать. Что изучает теория чисел?

dikiy ★★☆☆☆
()
Ответ на: комментарий от emulek

да запросто можно. И нужно.

ок. Ты уже попробовал сложить Over9000 чисел от 0 до 1? И сколько получилось?

откуда я знаю сколько. Надо взять верхний допуск и посмотреть оценку снизу/сверху.

Не торопись с ответом, подумай и попробуй. И тогда поймёшь, что твой эпсилон можно только складывать(пару раз). И что он ломается даже при умножении на целую константу.

да сколько хошь, столько и складывай. Я не понимаю, в чем проблема. Главное, в формуле ошибок не сделать.

Я уж молчу, что получится, при умножении одного числа с погрешностью, на другое число тоже с погрешностью.

ничего страшного не получиться. Будет даже лучше, чем со сложением:

[latex] ab(1+\epsilon_a)(1+\epsilon_b)=ab+(\epsilon_a+\epsilon_b)ab+\epsilon_a\epsilon_b ab \leq ab(1+2\epsilon)[/latex], где [latex] \epsilon[/latex] - это верхняя граница для ошибки («квадратный» член отбрасываем за малостью).

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 2)
Ответ на: комментарий от dikiy

выразить. читаем стандарт IEEE и видим там, что eps для double равен 1.11e-16.

Идиот. Клинический идиот. А ну-ка ответь все-таки на мой вопрос про сумму последовательности чисел, первое из которых на много порядков больше всех последующих.

anonymous
()
Ответ на: комментарий от dikiy

Рассказывай, какая тут будет потеря точности,

Ты идиот. Очень большое число A + очень маленькое число B (разница между порядками A и B такая, что перекрывает размерность мантиссы) будет равно очень большому числу A.

Соответственно, ошибка для такой суммы последовательности будет равна сумме всех «маленьких» чисел, даже если в сумме они сильно больше чем первое «большое» число. Объясняю специально на пальцах, на уровне детского сада, чтобы даже такое убожество, как ты, смого понять. А ты тут со своими ёбсилонами позоришься. Стыдно должно быть!

anonymous
()
Ответ на: комментарий от dikiy

Я не понимаю, в чем проблема.

В этом и беда ЛОРа. Тут большинство постоянно влезает в темы, в которых они ни хрена не понимают. И вам, уродам, даже не стыдно.

Где еще изучать синдром Даннинга-Крюгера, как не на ЛОРе?

anonymous
()
Ответ на: комментарий от anonymous

Я не понимаю, в чем проблема.

В этом и беда ЛОРа. Тут большинство постоянно влезает в темы, в которых они ни хрена не понимают. И вам, уродам, даже не стыдно.

в том-то и прикол, что многие видят пробелму там, где ее нет, если подумать немного.

dikiy ★★☆☆☆
()
Ответ на: комментарий от emulek

ты, козлик, просто знаешь лишь малую часть теории чисел.

Я по теории чисел защищался вообще-то.

Ту, про что что в вике рассказано. Все 3 странички.

Ну расскажи, соска, о тех частях теории чисел, о которых я почему-то вдруг не знаю. Естественно, с полными библиографическими ссылками. На слово такой залупе, как ты, никто здесь верить никогда не будет, так что изволь сослаться на внешний источник, который бы однозначно свидетельствовал о том, что генеральная линия партии нынче в том, чтобы считать численные методы подразделом теории чисел, а теорию чисел, соответственно, не считать более разделом дискретной математики.

anonymous
()
Ответ на: комментарий от dikiy

в том-то и прикол, что многие видят пробелму там, где ее нет, если подумать немного.

Ты говно. Рассказать тебе, говно, почему при сложении последовательности плавучих чисел эту последовательность всегда сначала сортируют по возрастанию, или все таки заткнешься и немного сам головой подумаешь?

anonymous
()
Ответ на: комментарий от anonymous

Рассказывай, какая тут будет потеря точности,

Ты идиот. Очень большое число A + очень маленькое число B (разница между порядками A и B такая, что перекрывает размерность мантиссы) будет равно очень большому числу A.

а теперь смотрим сюда:

[latex]A(1+\epsilon_A)+B(1+\epsilon_B)\leq (A+B)(1+2\epsilon)[/latex]. При A>>B имеем [latex]A(1+2\epsilon)[/latex]

что непонятно анонимусу?

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от dikiy

ладно. можно по другому попробовать. Что изучает теория чисел?

ВНЕЗАПНО: числа. Множества чисел и операции над ними. А вот численные методы изучают подмножества этих множеств. Числа типа сишных int'ов это подмножество множества целых чисел. А вот float'ы — это подмножество рациональных (числитель это int, а знаменатель — степень двойки).

emulek
()
Ответ на: комментарий от anonymous

Ты говно. Рассказать тебе, говно, почему при сложении последовательности плавучих чисел эту последовательность всегда сначала сортируют по возрастанию, или все таки заткнешься и немного сам головой подумаешь?

я это без тебя отлично знаю. А вот что ты тут пытаешься мяукать - непонятно совершенно. Или просто говоришь, что по методичке вызубрил?

причем ты даже здесь обосрался. Ибо сложение похер как выполнять (конечно если все числа позитивные).

dikiy ★★☆☆☆
()
Ответ на: комментарий от emulek

ладно. можно по другому попробовать. Что изучает теория чисел?

ВНЕЗАПНО: числа. Множества чисел и операции над ними.

а вот с операциями ты поторопился %)

А вот численные методы изучают подмножества этих множеств.

и все?

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

что непонятно анонимусу?

То, придурок, что ошибка тут будет не N*\epsilon_B, а N*B. И B может быть намного больше чем \epsilon.

anonymous
()
Ответ на: комментарий от emulek

хорош демагогии, пруфлинк дай.

http://ru.wikipedia.org/wiki/Проблема_остановки

Рассмотрим множество S алгоритмов, которые принимают на вход натуральное число и на выходе тоже выдают натуральное число. Выберем какой-нибудь полный по Тьюрингу язык программирования. Каждый алгоритм можно записать в виде конечной последовательности символов на этом языке.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Ибо сложение похер как выполнять (конечно если все числа позитивные).

Приказываю тебе, шлюшке, самостоятельно проделать эксперимент - сложить сначала возрастающую, а потом такую же но убывающую последовательности, и сравнить результат. Обосрешься.

anonymous
()
Ответ на: комментарий от anonymous

То, придурок, что ошибка тут будет не N*\epsilon_B, а N*B. И B может быть намного больше чем \epsilon.

где тут, дубинушка? Откуда ты N взял?

dikiy ★★☆☆☆
()
Ответ на: комментарий от emulek

ВНЕЗАПНО: числа.

Целые числа, придурок, целые. Исключительно. Без вариантов.

А вот float'ы — это подмножество рациональных

А рациональными числами теория чисел не занимается. Вообще.

anonymous
()
Ответ на: комментарий от dikiy

где тут, дубинушка? Откуда ты N взял?

Ты читать умеешь, сучка? Перечитай условие задачи. Складываем последовательность из большого количества (пусть будет N) малых чисел, для определенности одинаковых, пусть будет B, раз уж тебе так захотелось, но первое число в последовательности больше (настолько, что разница в порядках выше размерности мантиссы) чем B, и будет оно, для определенности, A.

anonymous
()
Ответ на: комментарий от anonymous

Ты читать умеешь, сучка? Перечитай условие задачи. Складываем последовательность из большого количества (пусть будет N) малых чисел, для определенности одинаковых, пусть будет B, раз уж тебе так захотелось, но первое число в последовательности больше (настолько, что разница в порядках выше размерности мантиссы) чем B, и будет оно, для определенности, A.

ну складываем. Получим [latex]\left(\sum a_i \right) (1+N\epsilon)[/latex]

и что сказать-то хотел? Что N\epsilon может быть больше A? Ну может быть больше. Что дальше?

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от emulek

Если следовать твоей логике, получается, что любой невычислимый/бесконечный алгоритм эквивалентен отсутствию вычисления. Приведи тогда пример алгоритма, который, по твоему мнению, будет тру-бесконечным.

anonimous
()
Ответ на: комментарий от dikiy

ок. Ты уже попробовал сложить Over9000 чисел от 0 до 1? И сколько получилось?

откуда я знаю сколько. Надо взять верхний допуск и посмотреть оценку снизу/сверху.

получится от 0 до Over9000. Но это неправильный ответ.

Не торопись с ответом, подумай и попробуй. И тогда поймёшь, что твой эпсилон можно только складывать(пару раз). И что он ломается даже при умножении на целую константу.

да сколько хошь, столько и складывай. Я не понимаю, в чем проблема. Главное, в формуле ошибок не сделать.

проблема в том, что практически всегда результат будет почти 1/2*Over9000, с очень небольшой погрешностью. Это "закон больших чисел" называется. Фишка в том, что эти твои эпсилоны нельзя складывать, ибо их сумма стремится к нулю. Или — НЕ стремится. Всё зависит от того, как их складывать.

Вот попроще: орёл это -1, решка это +1. В среднем это 0. Однако, если два раза подбросить, то получится 0 с вероятностью 1/2, и +-2 с вероятностью 1/4 и 1/4. Если провернуть численный эксперимент, то мы такую ерунду и наблюдаем — формула обычно даёт «точный» (почти)ответ, но иногда — люто врёт. Ну это если число операций конечно, но довольно большое, и при этом приняты меры для устранения накопления погрешности (т.е. каждая операция врёт ровно как монетка, в среднем на 0).

Будет даже лучше, чем со сложением

а теперь тоже самое, но в float'ах попробуй. Только пожалуйста прими меры к тому, что-бы компилятор считал именно во float'ах(и промежуточные результаты тоже), и ничего не оптимизировал. Будешь весьма удивлён.

Вот только не нужно на IEEE754 пенять.

emulek
()
Ответ на: комментарий от dikiy

что сказать-то хотел? Что N\epsilon может быть больше A? Ну может быть больше. Что дальше?

Ну ты пидарас, коммуняка рваная! Тупой, как дрова! Еще раз повторяю, медленно, для совсем уж скорбных мудаков: ошибка будет N*B, а не N*\epsilon_B. И B намного больше чем \epsilon_B.

anonymous
()
Ответ на: комментарий от anonymous

А ну-ка ответь все-таки на мой вопрос про сумму последовательности чисел, первое из которых на много порядков больше всех последующих.

считай в обратном порядке начиная с члена меньшего эпсилона.

emulek
()
Ответ на: комментарий от dikiy

в том-то и прикол, что многие видят пробелму там, где ее нет, если подумать немного.

проблемы «нет» тогда, и только тогда, когда ты сидишь на диване. Иди к компьютеру, и попробуй это забить в код. Тогда и поймёшь, что тех двух лекций достаточно только для твоего дивана, и для диалога с собой же. А для написания кода придётся теорию чисел вспомнить, увы. Хотя она тут и «не при чём».

emulek
()
Ответ на: комментарий от anonymous

Ну расскажи, соска, о тех частях теории чисел, о которых я почему-то вдруг не знаю. Естественно, с полными библиографическими ссылками.

увы. Я искал, и не смог найти. Вам, теоретикам, оно не нужно.

emulek
()
Ответ на: комментарий от emulek

увы. Я искал, и не смог найти. Вам, теоретикам, оно не нужно.

Ну, то есть, ты обосрался. Вперед, признавай себя публично пиздоболом и ламером. Непременно с деанонимизацией.

anonymous
()
Ответ на: комментарий от anonymous

выразить. читаем стандарт IEEE и видим там, что eps для double равен 1.11e-16.

Идиот. Клинический идиот. А ну-ка ответь все-таки на мой вопрос про сумму последовательности чисел, первое из которых на много порядков больше всех последующ

взял последовательность из миллиона чисел. Посчитал и так и эдак. ,Результат одинаковый.

dikiy ★★☆☆☆
()
Ответ на: комментарий от emulek

считай в обратном порядке начиная с члена меньшего эпсилона.

Уже лучше, но тоже не идеальный вариант. Если будем складывать очень-очень много маленьких чисел, то в какой-то момент мантисса переполнится и сумма перестанет расти. Для точного результата придется строить дерево сумм (грубо говоря, скобки расставить по последовательности сложений).

anonymous
()
Ответ на: комментарий от dikiy

взял последовательность из миллиона чисел. Посчитал и так и эдак. ,Результат одинаковый.

Разница между первым и последним, надеюсь, превышает разрядность мантиссы, как в условии задачи?

anonymous
()
Ответ на: комментарий от emulek

если два раза подбросить, то получится 0 с вероятностью

Весьма любопытно, как это у тебя получиться 0, это что, ребро штоле? На ребро монета должна встать? Ты берешь за средний результат которого в принципе быть не может. Я давно подозревал, что у тех кто черезчур увлечен число-бством, со временем развивается математика-ГМ.

anonimous
()
Ответ на: комментарий от anonymous

почему при сложении последовательности плавучих чисел эту последовательность всегда сначала сортируют по возрастанию

на самом деле не нужно. Достаточно ранжирования аргументов по 23м диапазонам, каждый из которых вдвое больше предыдущего. Если получается 24й диапазон, то его можно отбросить. Ну и в конце все 23 суммы складываются. А сортировка займёт слишком много времени и памяти потребует тоже немало. «Сортировать» есть смысл лишь если функция монотонная или типа того. Но это работает только со сложением.

emulek
()
Ответ на: комментарий от dikiy

Ибо сложение похер как выполнять

ну посчитай ln(2) суммой. Удивишься...

ВНЕЗАПНО: числа. Множества чисел и операции над ними.

а вот с операциями ты поторопился %)

кому нужны числа без операций?

А вот численные методы изучают подмножества этих множеств.

и все?

ты глупый, и не знаешь ответ? Или умный, и намекаешь, что я глупый? В последнем варианте — рассказывай. Внимаю с благоговением.

emulek
()
Ответ на: комментарий от dikiy

Выберем какой-нибудь полный по Тьюрингу язык программирования.

а теперь открой соответствующую статью в вике, и узнай, что полнота по Тьюрингу подразумевает бесконечную память. Бесконечность внутренне противоречива, с этим ты согласен? Но раз так, то как ты можешь строить логически непротиворечивое понятие используя противоречивую величину?

Вот тебе «доказательство», что чисел не существует:

1. предположим, что число существует.

2. есть аксиома Пеано, которая гласит, что если есть x, то есть и x+1, причём x+1 больше x.

3. Есть число «бесконечность», которое больше любого x

4. В силу (2), есть число «бесконечность+1», которое больше «бесконечность».

5. В силу (3), (4) ложно.

6. откуда, (1) также ложно.

7. ЧиТД, чисел не существует.

Не сложно понять, что ошибка кроется в (3). И там же кроется ошибка твоего «доказательства». Не существует алгоритма, который работает бесконечно долго. Такой алгоритм сам себе противоречит. А то, что мы можем его записать — не играет роли. На ноль мы тоже можем «поделить» в любом ЯП.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.