summaryrefslogtreecommitdiff
path: root/coding-exercises/1/27.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'coding-exercises/1/27.rkt')
-rw-r--r--coding-exercises/1/27.rkt24
1 files changed, 24 insertions, 0 deletions
diff --git a/coding-exercises/1/27.rkt b/coding-exercises/1/27.rkt
new file mode 100644
index 0000000..8762d6c
--- /dev/null
+++ b/coding-exercises/1/27.rkt
@@ -0,0 +1,24 @@
+#lang racket
+(require sicp)
+
+(define (square x)
+ (* x x))
+
+(define (expmod base e m)
+ (cond
+ ((= e 0) 1)
+ ((even? e)
+ (remainder (square (expmod base (/ e 2) m)) m))
+ (else
+ (remainder (* base (expmod base (- e 1) m)) m))))
+
+(define (fermat? a n)
+ (= (expmod a n n) a))
+
+(define (all-fermat n)
+ (define (f a n)
+ (cond
+ ((= a 0) true)
+ ((fermat? (- a 1) n) (f (- a 1) n))
+ (else false)))
+ (f n n))