Advertisement
Guest User

Untitled

a guest
Aug 13th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 2.99 KB | None | 0 0
  1. #lang racket
  2.  
  3. (define (nand-gate a b)
  4.   (if (and (= a 1) (= b 1)) 0 1))
  5.  
  6. (define (not-gate a)
  7.   (nand-gate a a))
  8.  
  9. (define (and-gate a b)
  10.   (not-gate (nand-gate a b)))
  11.  
  12. (define (or-gate a b)
  13.   (nand-gate (not-gate a) (not-gate b)))
  14.  
  15. (define (xor-gate a b)
  16.   (or-gate (and-gate a (not-gate b))
  17.            (and-gate (not-gate a) b)))
  18.  
  19. (define (eq-gate a b)
  20.   (not-gate (xor-gate a b)))
  21.  
  22. (define (add1 a b c-in)
  23.   (let ([res   (xor-gate c-in (xor-gate a b))]
  24.         [c-out (or-gate (and-gate a b)
  25.                         (and-gate (xor-gate a b) c-in))])
  26.     (values res c-out)))
  27.  
  28. (define (addN as bs)
  29.   (if (= (length as) (length bs))
  30.       (let rec ([c 0] [a (reverse as)] [b (reverse bs)] [n (length as)] [res (list)])
  31.         (if (zero? n) (if (zero? c)
  32.                           (reverse res)
  33.                           (append (list c) (reverse res)))
  34.             (let-values ([(res-bit c-tmp) (add1 (car a) (car b) c)])
  35.               (rec c-tmp (cdr a) (cdr b) (- n 1) (append res (list res-bit))))))
  36.       (let ([max-len (max (length as) (length bs))])
  37.         (addN (append (for/list ([i (in-range (- max-len (length as)))]) 0) as)
  38.               (append (for/list ([i (in-range (- max-len (length bs)))]) 0) bs)))))
  39.  
  40. (define (complementN as bits)
  41.   (if (>= (length as) bits)
  42.       (addN (map not-gate as)
  43.             (let* ([len (length as)]
  44.                    [len1 (- len 1)])
  45.               (for/list ([i (in-range len)]) (if (= len1 i) 1 0))))
  46.       (complementN (append (for/list ([i (in-range (- bits (length as)))]) 0) as)
  47.                    bits)))
  48.  
  49. (define (subN as bs)
  50.   (let ([bits (max (length as) (length bs))])
  51.     (reverse (take (reverse (addN as (complementN bs bits))) bits))))
  52.  
  53. (define (eqN as bs)
  54.   (if (= (length as) (length bs))
  55.       (let recur ([state 1] [n (length as)])
  56.         (if (zero? n) state
  57.             (recur (and-gate state
  58.                              (eq-gate (list-ref as (- n 1))
  59.                                       (list-ref bs (- n 1))))
  60.               (- n 1))))
  61.       (let ([max-len (max (length as) (length bs))])
  62.         (eqN (append (for/list ([i (in-range (- max-len (length as)))]) 0) as)
  63.              (append (for/list ([i (in-range (- max-len (length bs)))]) 0) bs)))))
  64.  
  65. (define (fibN n)
  66.   (let* ([len (length n)]
  67.          [len1 (- len 1)]
  68.          [zeroN (for/list ([i (in-range len)]) 0)]
  69.          [oneN  (for/list ([i (in-range len)]) (if (= len1 i) 1 0))]
  70.          [checkN (or-gate (eqN n zeroN) (eqN n oneN))])
  71.     (if (= 1 checkN) n
  72.         (let* ([n1 (subN n oneN)]
  73.                [n2 (subN n1 oneN)])
  74.           (addN (fibN n1) (fibN n2))))))
  75.  
  76. (define (fromN n)
  77.   (let ([len (length n)])
  78.     (for/sum ([i (in-range len)]) (* (list-ref n (- len i 1)) (expt 2 i)))))
  79.  
  80. (define (toN n)
  81.   (let rec ([x n] [res (list)])
  82.     (if (zero? x)
  83.         (append (list 0) res)
  84.         (rec (floor (/ x 2)) (append (list (modulo x 2)) res)))))
  85.  
  86. (define (verbose-fibN x)
  87.   (let ([n (toN x)])
  88.     (format "~a : ~a" x (fromN (fibN n)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement