1. Си / Говнокод #17290

    +138

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    int fermat (void)
    {
      const int MAX = 1000;
      int a=1,b=1,c=1;
      while (1) {
        if (((a*a*a) == ((b*b*b)+(c*c*c)))) return 1;
        a++;
        if (a>MAX) {
          a=1;
          b++;
        }
        if (b>MAX) {
          b=1;
          c++;
        }      
        if (c>MAX) {
          c=1;
        }
      }
      return 0;
    }
    
    #include <stdio.h>
    
    int main (void)
    {
      if (fermat()) {
        printf ("Fermat's Last Theorem has been disproved.\n");
      } else {
        printf ("Fermat's Last Theorem has not been disproved.\n");
      }
      return 0;
    }

    Fermat's Last Theorem has been disproved
    http://blog.regehr.org/archives/140

    Если уже было черкните мне на /dev/null@localhost, удалю

    Запостил: Elvenfighter, 11 Декабря 2014

    Комментарии (52) RSS

    • >> /dev/null@localhost
      што?
      Ответить
      • Да, удалось зарегать такое мыло. Только пока в почтовиках поддержку таких адресов не запилили.
        Ответить
        • А разве есть проблемы с почтовиками? Проблемы с ICANN, который не хочет регистрировать мой localhost в корневой зоне. Джва раза писал им с /dev/zero@localhost и с /dev/random@localhost, но так и не получил ответа. Сволочи!
          Ответить
    • 1. Было про то как gcc "оптимизирует" переполнения, после чего циклы начинают работать неправильно.
      2. Ни шланг 3.5 ни несвежий gcc 4.8 не смогли сделать disprove. Видимо пофиксили...
      3. Использовать такой фундаментально дырявый язык как сишечка (речь в первую очередь о переполнениях) для опровержения фундаментальных вещей — ну как бы помягче выразиться моветон.

      PS>Мне лет 15 назад один профессор математики, видя моё увлечение программированием говорил что это не математика, а так...
      Тогда я не совсем понял его. Но сейчас понимаю, что например хацкелисты со своими бесконечными списками не смогут доказать это:
      ∞        1
      Σ n = -  —
      ¹        12
      Ответить
      • Честно говоря -- термин "пофиксили" тут даже не особо подходит. Ведь вполне логично: имеем бесконечный цикл с одной возможностью выхода: return 1; то есть всё, что после цикла тупо не выполнится, и во всех случаях (а конкретно: в лучшем) функция может вернуть только 1. Плюс нет никакого взаимодействия с внешним миром (CPU не считается). Так зачем крутиться, если результатом может быть только 1?

        Впрочем, с точки зрения спинлоков такие оптимизации уже не кажутся столь обоснованными...
        Ответить
        • > спинлоков
          У спинлока есть связь со внешним миром.
          Ответить
        • >Ведь вполне логично: имеем бесконечный цикл с одной возможностью выхода: return 1; то есть всё, что после цикла тупо не выполнится, и во всех случаях (а конкретно: в лучшем) функция может вернуть только 1.
          Если я пишу бесконечный цикл, то я хочу чтобы он не имел конца.
          Допустим делаю некий cpu-stress-test, который например останавливается извне по kill -9. Мне не нужны такие "оптимизации".
          Ответить
          • Укажи, что оптимизировать не надо явно. Скажем добавь операцию над volatile переменной. Или какой-нибудь компиляторозависимый способ.

            99.9% людей нужно прямо противоположное, поэтому 1‰ придётся указывать свои пожелания явно.
            Ответить
          • -O0
            Ответить
            • -O0 для микроконтроллеров не нужен, а там бесконечный цикл в любой прошивке (ну и для перезагрузки тоже часто while(true);).
              Ответить
              • А while (true); он и не будет оптимизировать. Там же нет шансов на возврат.
                Ответить
      • > Было про то как gcc "оптимизирует" переполнения, после чего циклы начинают работать неправильно.
        http://govnokod.ru/16352

        Автор поста #16351, видимо, читал #229963 сами-знаете-где. Кстати, автор #229963 цитировал доказательство, которому посвящён обсуждаемый пост, и давал ссылку на Регера.
        Ответить
        • > начинают работать неправильно
          Эти циклы и без оптимизации работали неправильно. Хуже не стало.
          Ответить
        • 16352#239873
          Причём тут 16351 непонятно.
          Ответить
          • Да, так и есть. Досадная ошибка. Видимо, руками переписывал номер.
            P.S. А #229963 сами-знаете-где - не ошибка.
            Ответить
      • Ага. Только это не сумма в привычном нам смысле, и числа не "числа" в привычном нам смысле.
        Ответить
        • >и числа не "числа" в привычном нам смысле.
          Как это числа не "числа"? Поясните мысль.
          Ответить
          • ЕМНИП, n это т.н. p-adic numbers, а не целые.
            Ответить
            • Эээ. Совершенно непонятно как относятся p-adic numbers к обычному суммированию бесконечного ряда.

              Если, например, просуммировать n*n то получим рациональный бытовой 0.
              Почитайте про дзета-функцию и её тривиальные нули.
              Ну и заодно чему равно ζ(-1).
              Ответить
            • Девочки в падике, ёпт!
              Ответить
      • так это неправда
        Ответить
        • Что неправда? Там число утверждений >1.
          Ответить
          • что этот ряд сходится к минус одной двенадцатой
            Ответить
            • Так вселенная просто переполняется в бесконечности.
              Более простая аналогия: сумма степеней двойки сходится в -1.
              Ответить
              • не сходится
                в классической формуле не выполняется условие для предельного перехода
                Ответить
                • А никто не выполняет предельного перехода, просто обе части прогрессии.
                  sum = 1 + q + q² + q³ + ..
                  домножаются на (1-q) и ряд сгорает.
                  sum*(1-q)=1, где q=2
                  sum*(1-2)=1;
                  -sum=1;
                  Эйлер, который собаку съел на бесконечных рядах говорил что понятие суммы надо пересмотреть.

                  С 1+2+3+4+5+... такая же канитель, только там надо заходить издалека:
                  x = + 1 - 1 + 1 - 1 + ...
                  x + x = 1.
                  x = 0.5.

                  А потом делается финт ушами: производится возвредение в квадрат, , в лучших традициях древни греков - геометрически.

                  Ответить
                  • Как видно ряд идёт по горизонтали, и по вертикали
                    + 1 - 1 + 1 - 1 +1 ...
                    - 1 + 1 - 1 + 1 - ...
                    + 1 - 1 + 1 + ...
                    - 1 + 1 - ...
                    + 1 - ...
                    ...............

                    А суммируют это дело по диагонали
                    1 - 2 + 3 - 4 + 5 ... =(+ 1 - 1 + 1 - 1 + ...)² =¼
                    После чего хитрыми сложениями самого с собой через (1 - 2 + 3 - 4 + 5 - ...) выводится (1 + 2 + 3 + 4 + 5 - ...)
                    Никаких пределов тут нет. Чистая арифметика.
                    Ответить
                    • > Чистая арифметика.
                      Когда я вижу в арифметике эллипсис, то чую, что что-то тут не так :)
                      Это всё тлен, как и интеграл синуса от минус до плюс бесконечности, который по логике равен нулю.
                      Напомнило:
                      http://mathemlib.ru/books/item/f00/s00/z0000003/st075.shtml
                      Ответить
                      • >Это всё тлен, как и интеграл синуса от минус до плюс бесконечности, который по логике равен нулю.
                        Ну кстати да. А разве не ноль?
                        sum=x*(x+1)
                        Если взять от функции суммы арифметической прогресии интеграл по отрицательной части функции (от -1 до 0), угадайте что мы получим?

                        >Когда я вижу в арифметике эллипсис
                        Право же где вы увидели "в арифметике эллипсис", эллипсис он в грамматике.
                        Ответить
                        • > Право же где вы увидели "в арифметике эллипсис", эллипсис он в грамматике.
                          Как же в грамматике, если он в лексике? TT_ELLIPSIS же.

                          > >Это всё тлен, как и интеграл синуса от минус до плюс бесконечности, который по логике равен > нулю.
                          > Ну кстати да. А разве не ноль?
                          Вот нет. Точную формулировку обоснования не сообщу, ибо мой мозг это не вместил, а на уровне пятого класса выглядит как-то так:
                          - Петров! Чему равна плюс бесконечность?
                          - e^e^e, Мариванна!
                          - Хуй! Садись, два. Я прибавляю единичку и получаю число больше бесконечности.
                          Ответить
                          • >Вот нет. Точную формулировку обоснования
                            Представьте себе это графически. Каждой отрицательной области всегда соответствует положительная.
                            Ответить
                          • > >Это всё тлен, как и интеграл синуса от минус до плюс бесконечности, который по логике равен > нулю.
                            Чёто я сгоряча ляпнул про 0, а сейчас подумал, если он равен нулю, то разность + ∞-(- ∞), должна быть кратна периоду функции. Чего мы утверждать не вправе. Наверное интеграл равен неопределённости.
                            Ну и проинтегрировать, чему равен cos(∞), ну примерно тому же что и 0*∞.

                            Разве что попробовать разложить в ряд Тейлора, и там чего-то поискать. Но там она уж совсем явно расходится.
                            Ответить
                            • > Наверное интеграл равен неопределённости
                              Угу. Ряд то расходящийся.
                              Ответить
                              • Не-не-не. Я вон чуть выше суммирую расходящиеся ряды, а тут тоже ряд типа расходящийся, и всё — не определён.
                                Интуитивно-то это понятно, а вот где простое и понятное даже школьнику доказательство?

                                -cos(∞) — неопределённость, да.
                                Но он говорил об интеграле, а это разность:
                                -cos(∞) - (-cos(-∞)) = -cos(∞)+cos(-∞) = -(cos(∞)-cos(-∞))
                                В лоб это взять нельзя, может через ряд Тейлора, чтобы члены при отнимании сгорели, но я поступлю иначе:
                                .
                                          ix   -ix
                                         e  + e 
                                cos(x)= —————————
                                            2
                                            
                                                  i∞   -i∞          i*(-∞)   -i*(-∞)
                                                 e  + e            e      + e 
                                cos(∞)-cos(-∞)= —————————    -    ——————————————————  = 0
                                                      2                   2
                                Ответить
                                • Как видно ряд идёт по горизонтали, и по вертикали
                                  + 1 - 1 + 1 + ...
                                  - 1 + 1 - ...
                                  + 1 - 1 + 1 - ...
                                  + 1 - 1 + 1- 1 + 1 - 1 + 1 - 1 + 1 - 1 + ...)² =¼
                                  После чего циклы начинают работать неправильно.
                                  http://mathemlib.ru/books/item/f00/s00/z0000003/st075.shtml >Это всё тлен, как и интеграл синуса от минус до плюс бесконечности, который не хочет регистре этот бесконечный цикл в любой прошивке (ну и для перезагрузки тоже часто while(true);). А while (true); он и не будет оптимизации работали неправильно.
                                  http://govnokod.ru/16352

                                  Автор поста #16351, видимо, читал #229963 сами-знаете-где - не ошибка. Вид
                                  Ответить
                                  • Наконец освоил (не без помощи недальновидных коллег) установку юзерскрпитов и поставил бота?
                                    с-ё--ма да ты неибацца вырос интеллектуально - юзерскрипт смог поставить, лол.
                                    Ответить
                                    • Пи-д-р, у меня они лет 100 как стоят и они не без моей помощи появились вообще.
                                      Ответить
                                      • Кстати, автор #229963 цитировал доказать это: valueOf Ну а то что он про стандартом сравнить. Что интереснее, типа в сишном стандарте все зависит от интерпретации, а в крестовом - явно сказано что компиляторозависимый способ.

                                        Я тебе так с-ё--ма скажу, ты ж всё-равно тупой как пробка, дай дураку бота генераторного, он и лулз разобьёт и бота сломает.
                                        Ответить
                  • ты перегруппировываешь слагаемые, так делать нельзя в бесконечных рядах
                    Ответить
                    • >ты перегруппировываешь слагаемые, так делать нельзя в бесконечных рядах
                      Ладно не буду.
                      Рассмотрим ряд:
                      1 - 1 + 1- 1 + 1 + ...
                      По сути это геометрическая прогрессия (снова она, да) с q=-1
                      sum = 1 + q + q² + q³ + ..
                      sum = 1/(1-q)
                      Если подставить x=-q
                      То получим
                      1/(1+x) = 1 - x + x² - x³ + ..
                      Возведя обе части в квадрат получаем:
                      1/(1+x)² = 1 - 2*x + 3*x² - 4*x³ + ..
                      Строго эта формула доказывается очень просто - раскладываем 1/(1+x)² в ряд Тейлора.

                      При 0=<х<1 такой ряд явно сходится.

                      Потому левосторонний предел
                      1/(1+x)², где x->1-0 даёт нам 1/(1+1)²=¼

                      1 - 2 + 3 - 4 + .. = ¼
                      Ответить
                    • Вот, убедись что знакочередующийся ряд 1 - 2*x + 3*x² - 4*x³ + .. по приближении к 1 (к ряду знакочередующийся натуральных) сходится к 1/4.
                      var x=0.999;
                      var pow=1;
                      var sum=0;
                      for (var i=1;i<100000;++i){
                      	sum+=((1==(i&1)) ? i : -i)*pow;
                      	pow*=x;
                      }
                      sum //0.2502501876260166
                      Ответить
                  • Понравилось мне это число - бесконечность плюс один :)
                    sum = 1 + q + q^2 + ... + q^inf

                    Домножим на на (1-q):
                    sum * (1-q) = (1-q) * (1 + q + q^2 + ... + q^inf)

                    Раскроем первые скобки правой части:
                    sum * (1-q) = (1 + q + q^2 + ... + q^inf) - (q + q^2 + ... + q^(inf+1))

                    Раскроем оставшиеся скобки правой части:
                    sum * (1-q) = 1 + q + q^2 + ... + q^inf - q - q^2 - ... - q^(inf+1)

                    Сократим:
                    sum * (1-q) = 1 - q^(inf+1)

                    И всё. Не сходится это к минус одному.
                    Ответить
                    • >sum * (1-q) = (1-q) * (1 + q + q^2 + ... + q^inf)
                      Вы забыли inf+1,inf+2,inf+3,итд...
                      У вас inf - это конечность, после него уже ничего не идёт, а такого быть не должно. Какое бы вы inf не назвали, я всегда могу назвать больше.

                      Не должно быть конечного члена в бесконечном ряду, в этом и суть парадокса.
                      Ответить
                      • > Не должно быть конечного члена в бесконечном ряду, в этом и суть парадокса.
                        > inf - это конечность, после него уже ничего не идёт
                        Это понятно, тут нужен другой математический аппарат. Я к тому, что нельзя просто так взять и выкинуть из ряда член, чтобы два бесконечных ряда "схлопнулись" в число.
                        Ответить
                        • >Я к тому, что нельзя просто так взять и выкинуть из ряда член, чтобы два бесконечных ряда "схлопнулись" в число.
                          Я ж говорю Вселенная переполняется, и не может сохранить в регистре этот бесконечный разряд, потому 2^inf выпадает, остаётся -1.
                          Мы логически понимаем что там бесконечность, но она уходит в carry flag. А где он юзается - неизвестно (может это ничтожные квантовые флуктуации создающие случайную неопределённость для другой четырехмерной вселенной? :D
                          Ответить
                    • Честно говоря -- термин "пофиксили" тут даже не особо подходит. Ведь вполне логично: имеем бесконечных рядах говорил что этот результат суммирования подтвеждается опытами.
                      Ну а то что он про стандартом сравнить.
                      Ответить
                  • Тарасберу можешь не объяснять.
                    Ответить
                • Что интересно где-то в квантовой механике этот результат суммирования подтвеждается опытами.
                  Ну а то что число
                  11111111111111111111111111... в двоичной системе переполняется в -1 просто означает что наша Вселенная исполняется в дополнительном коде.
                  Ответить
      • >2. Ни шланг 3.5 ни несвежий gcc 4.8 не смогли сделать disprove. Видимо пофиксили...
        Ну так там (http://blog.regehr.org/archives/161) же написано:
        These C compilers known to not preserve termination properties of code: Sun CC 5.10, Intel CC 11.1, LLVM 2.7, Open64 4.2.3, and Microsoft Visual C 2008 and 2010.  The LLVM developers consider this behavior a bug and have since fixed it. As far as I know, the other compiler vendors have no plans to change the behavior.

        Т.е. gcc и был не подвержен, а шланг исправили.
        А вот то что он про стандарт пишет - интереснее, типа в сишном стандарте все зависит от интерпретации, а в крестовом - явно сказано что компилятор может теорему опровергать. Надо бы с последним стандартом сравнить.
        Ответить

    Добавить комментарий