1. Куча / Говнокод #9077

    +133

    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
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    (define rsagen
      (lambda ()
         (for-each (lambda (rsa counter)
                     (cond
                      ((> (random) 0.5)
                       (fprintf out-quest "%N=~s, d=~s\n\\item Задача. Криптосистема RSA. Дано: $p=~s,\\ q=~s,\\ e=~s$. Вычислить $N, d$.\n"
                                (third rsa)
                                (fifth rsa)
                                (first rsa)
                               (second rsa)
                               (fourth rsa)
                               
                               ))
                      (else
                       ((lambda (randM) 
                          (fprintf out-quest "%p=~s,q=~s,e=~s,M=~s\n\\item Задача. Криптосистема RSA. Дано: $d=~s,\\ N=~s,\\ C=~s$. Вычислить $M$.\n"
                                   (first rsa)
                                   (second rsa)
                                   (fourth rsa)
                                (rsacrypt randM (fourth rsa) (third rsa))
                                (fifth rsa)
                               (third rsa)
                               randM
                               ))
    
                        ((Y
                          (lambda (checkrand)
                            (lambda (randf)
                              ((lambda (rand)
                                 (cond
                                  ((not (eq? (rsacrypt rand (fourth rsa) (third rsa)) rand))
                                   rand)
                                  (else
                                   (checkrand randf))))
                               (randf)))))
                         (lambda () (- (third rsa) (+ (random (quotient (third rsa) 2)) 1))))
                         
                        )
                        )
                       )
                     )
                   (take (shuffle (getalllistallmany_e (next-primes 7 50) (next-primes 5 10))) 14)
                   (build-list 14 (lambda (x) (+ x 1))))
         ))

    Генерирование заданий по криптосистеме RSA. Обратите внимание на Y комбинатор.

    Запостил: shem, 11 Января 2012

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

    • Уряяяя, говнокод на лиспе!!!
      Ответить
    • Странно, что числа выражены как константы, а не в терминах чистого λ-исчисления. Чувак, похоже, основательно нанюхался β-редукции и η-преобразований.
      Проще надо быть, проще.
      Ответить
    • А я ничего не понял. Я тупое IT-быдло.
      Ответить
      • Когда ты пишешь рекурсивные функции, тебе приходится вызывать функции по имени. В чистом λ-исчислении функции не имеют имён, поэтому просто так записать рекурсию не получиться.
        Y-комбинатор - это такая могучая хрень, удовлетворяющая уравнению
        Y f = f (Y f)
        (типа неподвижная точка), которая позволяет выражать рекурсию для безымянных функций.
        Однако создатели Scheme не были настолько суровыми извращенцами, чтоба запретить давать функциям имена. Кроме того, там можно иметь вложенные определения функций. Поэтому причина появления Y-комбинатора в явном виде довольно таинственна. Возможно, автору кода жмёт череп.
        Ответить
        • не получится
          Ответить
        • Я пока читаю статью про Y-комбинатор, к завтра пойму это всё.
          Ответить
          • А типа Y - это стандартная функция в Лиспе?
            Ответить
            • Лиспов есть много разных, Scheme - это только один из вариантов, обычно ассоциируется со студентами, и программистами, кому очень нравится лямбда исчисление (раздел математики очень близкий к информатике, используя очень небольшой набор аксиом описывает любую проблему программирования, но писать программы на нем нет смысла, так же как и на brainfuck, например). Scheme отличается от других лиспов еще и тем, что в нем очень мало чего есть. В том смысле, что в других лиспах есть много встроенных функций, библиотек и т.п. т.е. они предназначены для обычной повседневной работы программиста, только разве что с большим упором на динамичность, которая особенно подходит для решения задачь связанных с AI.
              Y - не сдандартная функция лиспа (собственно, стандартных лиспов есть всего один - ANSI Lisp, Common Lisp в большой степени старается следовать этому стандарту, но практически любая реализация добавляет кучу своего собственного помимо стандарта).
              Если очень просто, то Y по отношению к функции, как
              var o = { };
              o.valueOf = function() { return o; }

              (JavaScript)
              по отношению к объекту. Т.е. такая специальная конструкция, которая вызывает рекурсивно другую функцию (обычно передавая вызываемую функцию параметром ей же самой - за счет чего выполняемая функция перестает быть сама по себе рекурсивной, а рекурсию нужно обрабатывать только для Y, это делает вычисления для компиляторов функциональных языков более простыми).
              Ответить
              • > Scheme отличается от других лиспов еще и тем, что в нем очень мало чего есть
                lisp без макросов - как водка без пива
                Ответить
      • А я б тоже ниче не понял, если б не знал как работает RSA.
        Что p и q - простые числа (они же публичный, приватный ключи, e - функция Эйлера=(p-1)*(q-1), M - степень)
        rand - нужен для генерации случайных простых p и q, но код тут приведен неполностью - неясно что там считает next-primes


        Правда где тут говно мне непонятно.
        Одно могу сказать точно - 5 10; 7 50 - слишком малые числа для серъезного RSA. И потому оно пахнет лабой.
        Ответить
        • Оно до 512 бит включительно несерьёзное.
          Ответить
    • генератор ЛАмБд
      Ответить
    • Я заблудилсо в коде и не могу из него выйти
      Ответить
    • А в Scheme нет flet / labels? Даже с обычным let читать было бы удобнее... или именно в том и фишка, чтобы их не использовать?
      Ответить
      • В Scheme flet/labels не нужен, ведь Scheme - Lisp-1. Там есть let и let*, кроме того, можно использовать вложенные define. Фишка была именно в жонглировании безымянными функциями.
        Ответить
        • Так и в CL можно вложеные дефайны. Ну тут как бы даже не жонглирование... тут одной бы хватило, не понятно зачем 3 понадобилось. Я думал это потому, что нельзя "сохранить" и вызвать второй раз по ссылке.
          Ответить
          • defun в CL определяет символ в пакете. Он может находиться внутри let, к примеру, но после выхода из let символ будет всё ещё доступен.
            http://ideone.com/tZBxr
            Вложить defun в другой defun не получится, нужен flet или labels.
            В Scheme всё немного проще и логичнее:
            define определяет символ в локальном скопе и во внешний скоп определение не попадает. Разумеется, можно использовать define внутри определения функции для определения вспомогательных функций.
            http://ideone.com/0FVc5
            Разница есть и она ощутима, хоть и не принципиальна. На мой взгляд, подход Scheme более интуитивен и красив.
            Ответить
            • Ну так defun это просто популярный макрос... если нужно, чтобы определял не в пакете можно сделать другой. Вложить defun в defun еще как можно, никаких противопоказаний к этому я не вижу...
              * (defun outer (a b)
                  (defun inner ()
                    (+ a b)))
              
              OUTER
              * (funcall (outer  2 3))
              
              5
              * (inner)
              
              5
              *
              Ответить
              • А теперь вызовем inner без вызова outer и БУМ. Не FP стайл :)
                Да, конструкция позволительна, я ошибся, ideone.com сбил с толку.
                http://ideone.com/GYk9d
                Мне CL нравиться больше из-за своей практичности. Просто в Scheme некоторые вещи сделаны более красиво и удобно.
                Ответить
    • Ухты, лисп)))))))))))))))))))))))
      Ответить
    • А если define - макрос, то как он определён?
      Ответить
      • в scheme нет макросов, там это предопределённая особая форма.
        В CL есть defun, определённый обычно в терминах, зависящих от реализации. Во что он превращается, можно посмотреть в самой лисп-системе.
        http://ideone.com/45nZ9
        Ответить
    • Потом парень заканчивал, снимал презик, бросал его на пол, а эта самка ожидала следующего героя. Иногда за вечер через Наткину вагину «проходило» до двух десятков парней!
      Ответить
    • Отец Дани обвёл всех взглядом. Катя радостно улыбалась, Данька аж светился, Дима же сидел, понурив голову, и о чём-то думал. Мужчина подошёл к нему, ласково потрепал светлые кудри, и сказал:
      Ответить

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