;;;; modular-arithmatic-tables.lisp ;;;; ;;;; Copyright (c) 2016 Samuel W. Flint (defpackage #:mod-arithmatic (:use #:cl) (:export :print-tables-z_n :make-z_n-tables)) (in-package #:mod-arithmatic) ;;; "mod-arithmatic" goes here. (defun euclid-gcd (a b) (check-type a integer) (check-type b integer) (cond ((zerop b) a) ((= a b) a) ((< a b) (euclid-gcd b a)) (t (euclid-gcd b (mod a b))))) (defun z_n-divisors (n) (remove-if (lambda (x) (not (= 1 (euclid-gcd x n)))) (loop for i from 1 to (1- n) collect i))) (defun z_n-addition-table (n) (loop for i from 0 to (1- n) collect (loop for j from 0 to (1- n) collect (mod (+ i j) n)))) (defun z_n-multiplication-table (n) (loop for i from 0 to (1- n) collect (loop for j from 0 to (1- n) collect (mod (* i j) n)))) (defun print-z_n-addition-table (n stream) (format stream "~{~{~4d~}~&~}" (z_n-addition-table n))) (defun print-z_n-multiplication-table (n stream) (format stream "~{~{~4d~}~&~}" (z_n-multiplication-table n))) (defun print-tables-z_n (n stream) (check-type n integer) (format stream "Addition Table (Z_~d):~%" n) (print-z_n-addition-table n stream) (format stream "~&~%Multiplication Table (Z_~d):~%" n) (print-z_n-multiplication-table n stream) (format stream "~&~%Divisors in Z_~d:~&" n) (format stream "~{~a~^, ~}" (z_n-divisors n))) (defun make-z_n-tables (n filename) (with-open-file (output filename :direction :output :if-exists :overwrite :if-does-not-exist :create) (print-tables-z_n n output))) ;;; End mod-arithmatic