Advertisement
Guest User

Untitled

a guest
Aug 10th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 2.21 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) (reverse res)
  32.             (let-values ([(res-bit c-tmp) (add1 (car a) (car b) c)])
  33.               (rec c-tmp (cdr a) (cdr b) (- n 1) (append res (list res-bit))))))
  34.       (error "List must have same lengths.")))
  35.  
  36. (define (complementN as)
  37.   (addN (map (lambda (x) (not-gate x)) as)
  38.         (let* ([len (length as)]
  39.                [len1 (- len 1)])
  40.           (for/list ([i (in-range len)]) (if (= len1 i) 1 0)))))
  41.  
  42. (define (subN as bs)
  43.   (addN as (complementN bs)))
  44.  
  45. (define (eqN as bs)
  46.   (if (= (length as) (length bs))
  47.       (let recur ([state 1] [n (length as)])
  48.         (if (zero? n) state
  49.             (recur (and-gate state
  50.                              (eq-gate (list-ref as (- n 1))
  51.                                       (list-ref bs (- n 1))))
  52.               (- n 1))))
  53.       (error "List must have same lengths.")))
  54.  
  55. (define (fibN n)
  56.   (let* ([len (length n)]
  57.          [len1 (- len 1)]
  58.          [zeroN (for/list ([i (in-range len)]) 0)]
  59.          [oneN  (for/list ([i (in-range len)]) (if (= len1 i) 1 0))]
  60.          [checkN (or-gate (eqN n zeroN) (eqN n oneN))])
  61.     (if (= 1 checkN) n
  62.         (let* ([n1 (subN n oneN)]
  63.                [n2 (subN n1 oneN)])
  64.           (addN (fibN n1) (fibN n2))))))
  65.  
  66. (define (fromN n)
  67.   (let ([len (length n)])
  68.     (for/sum ([i (in-range len)]) (* (list-ref n (- len i 1)) (expt 2 i)))))
  69.  
  70. (define (verbose-fibN n)
  71.   (format "~a : ~a" (fromN n) (fromN (fibN n))))
  72.  
  73. ; (verbose-fibN (list 0 0 0 1 0 1 0 1))
  74. ; => "21 : 194"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement