<?xml version="1.0"?>
<paste-with-annotations>
  <paste>
    <number>
      <integer>54420</integer>
    </number>
    <user>
      <string>faxathisia</string>
    </user>
    <title>
      <string>Godel &amp;#946;</string>
    </title>
    <contents>
      <string>(defun factorial (n)
  (if (= n 0) 1
      (* n (factorial (- n 1)))))

(defun extended-euclidean-algorithm (a b)
  ;; function extended_gcd(a, b)
  ;;  if (a mod b = 0)
  ;;     return {0, 1}
  ;;  else {x, y} := extended_gcd(b, a mod b)
  ;;       return {y, x-y*(a div b)}
  (if (= (mod a b) 0) (values 0 1)
      (multiple-value-bind (x y) 
          (extended-euclidean-algorithm b (mod a b))
        (values y (- x (* y (floor a b)))))))

(defun extended-euclidean-algorithm-prime (a b)
  ;; extended-euclidean-algorithm solves:
  ;;  u*a + v*b = gcd
  ;; This one solves:
  ;;  u*a - v*b = gcd
  (multiple-value-bind (u v)
      (extended-euclidean-algorithm a b)
    (if (= b 1)
        (values 1 (- a 1))
        (values u (- v)))))

;; For every finite sequence k_0, k_1, ..., k_r there exist two numbers m, n, such that (&amp;#946; m n j) = k_j, for j = 0..r.
(defun &amp;#946; (m n j)
  (mod m (+ (* n (+ j 1)) 1)))

;; Produce n m, such that (&amp;#946; m n j) = k_j
(defun &amp;#946;-solve (k)
  (let* ((n (factorial (apply #'max (- (length k) 1) k)))
         (a (loop for j below (length k) collect (+ (* n (+ j 1)) 1))))
    (labels ((next-m (l m)
               (if (= l (- (length k) 1)) m
                   (let ((a* (apply #'* (subseq a 0 (min (+ l 1) (length k))))))
                     (multiple-value-bind (u v)
                         (extended-euclidean-algorithm-prime (elt a (+ l 1)) a*)
                       (declare (ignore u))
                       (next-m (+ l 1)
                               (+ m (* (* (- m (elt k (+ l 1))) v) a*))))))))
      (values (next-m 0 (elt k 0)) n))))


;; (&amp;#946;-solve (map 'list #'char-code &quot;You win!&quot;))
;; (loop for j below length collect (&amp;#946; n m j))

</string>
    </contents>
    <universal-time>
      <integer>3409651944</integer>
    </universal-time>
    <channel>
      <string>#lispcafe</string>
    </channel>
    <colorization-mode>
      <string></string>
    </colorization-mode>
    <maybe-spam>
      <null/>
    </maybe-spam>
    <is-unicode>
      <null/>
    </is-unicode>
  </paste>
  <annotation>
    <number>
      <integer>1</integer>
    </number>
    <user>
      <string>fax</string>
    </user>
    <title>
      <string>learn 2 unicode</string>
    </title>
    <contents>
      <string>(defun factorial (n)
  (if (= n 0) 1
      (* n (factorial (- n 1)))))

(defun extended-euclidean-algorithm (a b)
  ;; function extended_gcd(a, b)
  ;;  if (a mod b = 0)
  ;;     return {0, 1}
  ;;  else {x, y} := extended_gcd(b, a mod b)
  ;;       return {y, x-y*(a div b)}
  (if (= (mod a b) 0) (values 0 1)
      (multiple-value-bind (x y) 
          (extended-euclidean-algorithm b (mod a b))
        (values y (- x (* y (floor a b)))))))

(defun extended-euclidean-algorithm-prime (a b)
  ;; extended-euclidean-algorithm solves:
  ;;  u*a + v*b = gcd
  ;; This one solves:
  ;;  u*a - v*b = gcd
  (multiple-value-bind (u v)
      (extended-euclidean-algorithm a b)
    (if (= b 1)
        (values 1 (- a 1))
        (values u (- v)))))

;; For every finite sequence k_0, k_1, ..., k_r there exist two numbers m, n, such that (beta m n j) = k_j, for j = 0..r.
(defun beta (m n j)
  (mod m (+ (* n (+ j 1)) 1)))

;; Produce n m, such that (beta m n j) = k_j
(defun beta-solve (k)
  (let* ((n (factorial (apply #'max (- (length k) 1) k)))
         (a (loop for j below (length k) collect (+ (* n (+ j 1)) 1))))
    (labels ((next-m (l m)
               (if (= l (- (length k) 1)) m
                   (let ((a* (apply #'* (subseq a 0 (min (+ l 1) (length k))))))
                     (multiple-value-bind (u v)
                         (extended-euclidean-algorithm-prime (elt a (+ l 1)) a*)
                       (declare (ignore u))
                       (next-m (+ l 1)
                               (+ m (* (* (- m (elt k (+ l 1))) v) a*))))))))
      (values (next-m 0 (elt k 0)) n))))


;; (beta-solve (map 'list #'char-code &quot;You win!&quot;))
;; (loop for j below length collect (beta n m j))
</string>
    </contents>
    <universal-time>
      <integer>3409662523</integer>
    </universal-time>
    <channel>
      <string>#lispcafe</string>
    </channel>
    <colorization-mode>
      <string></string>
    </colorization-mode>
    <maybe-spam>
      <null/>
    </maybe-spam>
    <is-unicode>
      <null/>
    </is-unicode>
  </annotation>
</paste-with-annotations>