Saturday, August 22, 2009

Euler Project 69

Euler's Totient function, φ(n) [sometimes called the phi function], is used to determine the number of numbers less than n which are relatively prime to n. For example, as 1, 2, 4, 5, 7, and 8, are all less than nine and relatively prime to nine, φ(9)=6.

nRelatively Primeφ(n)n/φ(n)
2112
31,221.5
41,322
51,2,3,441.25
61,523
71,2,3,4,5,661.1666...
81,3,5,742
91,2,4,5,7,861.5
101,3,7,942.5

It can be seen that n=6 produces a maximum n/φ(n) for n ≤ 10.

Find the value of n ≤ 1,000,000 for which n/φ(n) is a maximum.


My Solution

(defun  primep (n)
        (cond ((minusp n) 'nil)
                  ((= 2 n) t)
                  ((evenp n) 'nil)
                  ((= 1 n) 'nil)
                  (t (let ((limit (floor (sqrt n))))
                      (do ((i 3 (incf i 2)))
                            ((> i limit) t)
                            (if (= 0 (mod n i)) (return-from primep 'nil)))))))

(defun totient(n)
  (let ((primelist (loop for i from 1 to (floor (sqrt n))
                                when (and (zerop (rem n i))
                                                (primep i))
                                collect i
                                when (and (integerp (/ n i))
                                                (primep (/ n i))
                                                (null (eq (/ n i) i)))
                                collect (/ n i))))
    (* n (apply #'*
                    (mapcar #'(lambda(x)(/ (- x 1) x))
                                primelist)))))

(defun Euler69(n)
  (let ((maxn 0)
         (currentnum 0)
         (maxnum 0)) 
    (loop for i from 5 to n
            do(progn (setq currentnum (/ i (totient i)))
                          (if (> currentnum maxnum)
                              (progn (setq maxnum currentnum)
                                        (setq maxn i)))))
    maxn))


No comments:

Post a Comment