Author Topic: -={ Challenge }=- is Prime  (Read 10138 times)

0 Members and 1 Guest are viewing this topic.

Lee Mac

  • Seagull
  • Posts: 12914
  • London, England
-={ Challenge }=- is Prime
« on: September 18, 2010, 02:03:35 PM »
The Challenge:

To construct a function to determine whether a natural number (positive integer) is prime.

Pour construire une fonction pour déterminer si un nombre naturel (entier positif) est premier.

Для построения функции определить, является ли натуральное число (целое положительное число) является простым.


Definition of a prime number:

A number only evenly divisible by itself and 1

Notes:

0 and 1 are not prime


To kick off:

Code: [Select]
(defun LM:Primep ( n )
  (and (/= n 1)
    (or (= n 2)
      (not
        (vl-some
          (function
            (lambda ( d ) (zerop (rem n d)))
          )
          (
            (lambda ( i r / l )
              (while (<= (setq i (+ 2 i)) r) (setq l (cons i l)))
              (cons 2 l)
            )
            1 (sqrt n)
          )
        )
      )
    )
  )
)

Enjoy!

VovKa

  • Water Moccasin
  • Posts: 1631
  • Ukraine
Re: -={ Challenge }=- is Prime
« Reply #1 on: September 18, 2010, 03:44:27 PM »
no Ukrainian translation, can't participate, sorry :(
:)

roy_043

  • Water Moccasin
  • Posts: 1895
  • BricsCAD 18
Re: -={ Challenge }=- is Prime
« Reply #2 on: September 18, 2010, 06:10:44 PM »
No new mathematical insights just a slightly different approach. On a number like 100000001 (can be divided by 17) my code is faster than Lee's. But on big numbers that are primes, like 1508138953, performance is similar.
Of course on even numbers my code wins hands down. :-D

Code: [Select]
(defun kg:PrimeP (n / maxI i)
  (and
    (/= n 1)
    (or
      (= n 2)
      (and
        (/= (rem n 2) 0) ; check for even number
        (/= (setq maxI (sqrt n)) (fix maxI)) ; rare occurrence but you never know...
        (progn
          (setq i 1)
          (while (and (/= (rem n (setq i (+ i 2))) 0) (<= i maxI)))
          (/= (rem n i) 0)
        )
      )
    )
  )
)
« Last Edit: September 18, 2010, 06:23:59 PM by roy_043 »

Lee Mac

  • Seagull
  • Posts: 12914
  • London, England
Re: -={ Challenge }=- is Prime
« Reply #3 on: September 18, 2010, 06:30:04 PM »
no Ukrainian translation, can't participate, sorry :(
:)

:-D

Probably best that you don't - we'd have no chance  :wink:
 :-)

Lee Mac

  • Seagull
  • Posts: 12914
  • London, England
Re: -={ Challenge }=- is Prime
« Reply #4 on: September 18, 2010, 06:30:32 PM »
No new mathematical insights just a slightly different approach. On a number like 100000001 (can be divided by 17) my code is faster than Lee's. But on big numbers that are primes, like 1508138953, performance is similar.
Of course on even numbers my code wins hands down. :-D

Nice coding Roy  :-)

Lee Mac

  • Seagull
  • Posts: 12914
  • London, England
Re: -={ Challenge }=- is Prime
« Reply #5 on: September 18, 2010, 07:07:54 PM »
Using theory that all integers can be represented in the form 6k+i for integer k, i=−1, 0, 1, 2, 3, 4 with 2 dividing (6k + 0), (6k + 2), (6k + 4) and 3 dividing (6k + 3)

Code: [Select]
(defun LM:Primep ( n / m u )
  (and (/= n 1)
    (or (= n 2) (= n 7)
      (not
        (or
          (zerop (rem n 2))
          (zerop (rem n 3))
          (zerop (rem (setq u (sqrt n)) 1))
          (progn
            (setq i 0.0)
            (while
              (and (<= (setq m (+ (* 6.0 (setq i (1+ i))) 1.0)) u)
                   (/= 0 (rem n m))
                   (/= 0 (rem n (- m 2.0)))
              )
            )
            (or (zerop (rem n m))
                (zerop (rem n (- m 2.0)))
            )
          )
        )
      )
    )
  )
)
« Last Edit: September 18, 2010, 07:10:55 PM by Lee Mac »

gile

  • Gator
  • Posts: 2507
  • Marseille, France
Re: -={ Challenge }=- is Prime
« Reply #6 on: September 19, 2010, 03:57:24 AM »
Hi,

Here's something I wrote sometimes ago, trying to make a function which 'learns'.
Rather than restart calculations from the first prime numbers, all 'knowed' prime numbers are stored in a list within the function.

Here's a 'demonstrative version'
Code: [Select]
(defun-q
  prime
  (num / lst den loop)
  (setq lst '(2 3))
  (if (and (= (type num) 'INT) (< 0 num))
    (if (or (member num lst) (= 1 num))
      (alert (strcat "I already know: " (itoa num) " is prime."))
      (if (< num (setq den (last lst)))
        (alert (strcat "I already know: " (itoa num) " is not prime."))
        (if (vl-some '(lambda (x) (zerop (rem num x))) lst)
          (alert (strcat "I calculated: " (itoa num) " is not prime."))
          (progn
            (setq loop   T
                  den (+ den 2)
            )
            (while (and loop (<= den num))
              (if (vl-some '(lambda (x) (zerop (rem den x))) lst)
                 (setq den (+ den 2))
                 (progn
                   (setq lst (append lst (list den)))
                   (alert (strcat "I learned a new prime number: "
                                  (itoa den)
                          )
                   )
                   (if (zerop (rem num den))
                     (if (= num den)
                       (alert (strcat "Now, I know "
                                      (itoa num)
                                      " is prime."
                              )
                       )
                       (progn
                         (alert (strcat "I calculated: "
                                        (itoa num)
                                        " is not prime."
                                )
                         )
                         (setq loop nil)
                       )
                     )
                     (setq den (+ den 2))
                   )
                 )
              )
            )
          )
        )
      )
    )
    (alert "Needs a strictly positive number")
  )
  (setq prime
         (cons (car prime)
               (cons (list 'setq 'lst (list 'quote lst))
                     (cddr prime)
               )
         )
  )
  (princ)
)

The same one with a boolean return.
(eval (cadr isPrime)) returns the list of the 'already knowed' prime numbers
Code: [Select]
(defun-q
  isPrime
  (num / lst den loop result)
  (setq lst '(2 3))
  (if (and (= (type num) 'INT) (< 0 num))
    (if (or (member num lst) (= 1 num))
      (setq result T)
      (if (<= (setq den (last lst)) num)
        (if (not (vl-some '(lambda (x) (zerop (rem num x))) lst))
          (progn
            (setq loop   T
                  den (+ den 2)
            )
            (while (and loop (<= den num))
              (if (vl-some '(lambda (x) (zerop (rem den x))) lst)
                 (setq den (+ den 2))
                 (progn
                   (setq lst (append lst (list den)))
                   (if (zerop (rem num den))
                     (if (= num den)
                       (setq result T)
                       (setq loop nil)
                     )
                     (setq den (+ den 2))
                   )
                 )
              )
            )
          )
        )
      )
    )
  )
  (setq isPrime
         (cons (car isPrime)
               (cons (list 'setq 'lst (list 'quote lst))
                     (cddr isPrime)
               )
         )
  )
  result
)
Speaking English as a French Frog

VovKa

  • Water Moccasin
  • Posts: 1631
  • Ukraine
Re: -={ Challenge }=- is Prime
« Reply #7 on: September 19, 2010, 04:28:05 AM »
Code: [Select]
(kg:PrimeP 3)
(LM:Primep 3)
(LM:Primep 5)

qjchen

  • Bull Frog
  • Posts: 285
  • Best wishes to all
Re: -={ Challenge }=- is Prime
« Reply #8 on: September 19, 2010, 07:41:48 AM »
Code: [Select]
;;;by qjchen@gmail.com
(defun is-prime(n)
 (defun find-2 (n i)
  (cond ((> (* i i) n) n)
        ((= (rem n i) 0) i)
        (T (find-2 n (1+ i)))
  )
 )
 (cond ((and (= (type n) 'INT) (> n 1)) (= (find-2 n 2) n))
       (T nil))
)

recently I also join a challenge here
http://bbs.mjtd.com/dispbbs.asp?boardid=37&Id=83019

there is also a is-prime question.
« Last Edit: September 19, 2010, 07:48:57 AM by qjchen »
http://qjchen.mjtd.com
My blog http://chenqj.blogspot.com (Chinese, can be translate into English)

Lee Mac

  • Seagull
  • Posts: 12914
  • London, England
Re: -={ Challenge }=- is Prime
« Reply #9 on: September 19, 2010, 08:53:20 AM »
Code: [Select]
(kg:PrimeP 3)
(LM:Primep 3)
(LM:Primep 5)

Ahhh!  :lol:  How did i miss that  :oops:

Lee Mac

  • Seagull
  • Posts: 12914
  • London, England
Re: -={ Challenge }=- is Prime
« Reply #10 on: September 19, 2010, 09:20:45 AM »
Same theory as above, but with modulo 12

Code: [Select]
(defun LM:Primep ( n / u m )
  (and (/= n 1)
    (or (member n '(2 3 5 7 11))
      (not
        (or
          (zerop (rem n 2))
          (zerop (rem n 3))
          (zerop (rem (setq u (sqrt n)) 1))
          (progn
            (setq i 0.0)
            (while
              (and
                (<= (setq m (+ (* 12.0 (setq i (1+ i))) 7.0)) u)
                (/= (rem n m) 0)
                (/= (rem n (- m 2)) 0)
                (/= (rem n (- m 6)) 0)
                (/= (rem n (- m 8)) 0)
              )
            )
            (vl-some (function (lambda ( x ) (zerop (rem n (- m x))))) '(0 2 6 8))
          )
        )
      )
    )
  )
)

Lee Mac

  • Seagull
  • Posts: 12914
  • London, England
Re: -={ Challenge }=- is Prime
« Reply #11 on: September 19, 2010, 09:39:33 AM »
Hi,

Here's something I wrote sometimes ago, trying to make a function which 'learns'.
Rather than restart calculations from the first prime numbers, all 'knowed' prime numbers are stored in a list within the function.


Nice solution Gile - that is some great lateral thinking  :-)

roy_043

  • Water Moccasin
  • Posts: 1895
  • BricsCAD 18
Re: -={ Challenge }=- is Prime
« Reply #12 on: September 19, 2010, 10:33:07 AM »
Code: [Select]
(kg:PrimeP 3)
(LM:Primep 3)
(LM:Primep 5)

Code: [Select]
(kg:PrimeP 3) => nil
(LM:Primep 3) => T (first version of LM:Primep)
(LM:Primep 5) => T (first version of LM:Primep)
:oops: :oops: Well spotted VovKa!
« Last Edit: September 19, 2010, 11:16:49 AM by roy_043 »

roy_043

  • Water Moccasin
  • Posts: 1895
  • BricsCAD 18
Re: -={ Challenge }=- is Prime
« Reply #13 on: September 19, 2010, 12:44:42 PM »
Code: [Select]
;;;by qjchen@gmail.com
(defun is-prime(n)
....
It's always nice to see (and try to understand :wink:) a recursive function. But for very big numbers recursion is a problem:
Code: [Select]
(is-prime 1508138953) => error : LISP recursion stack limit exceeded

LE3

  • Guest
Re: -={ Challenge }=- is Prime
« Reply #14 on: September 19, 2010, 03:01:43 PM »
To construct a function to determine whether a natural number (positive integer) is prime.

Pour construire une fonction pour déterminer si un nombre naturel (entier positif) est premier.

Для построения функции определить, является ли натуральное число (целое положительное число) является простым.

Y Ahora? porque nada mas para los que hablen o entiendan esos idiomas....  :-P

Buena onda eh!  :evil:

De todas maneras aqui esta una opcion:
Code: [Select]
static bool isPrime(int num)
{
if (num<=0 || num==1) return false;
for (int p=2; p<=num/2; p++) { if (num%p==0) return false; }
return true;
}
« Last Edit: September 19, 2010, 03:51:47 PM by LE »