fastfunc isprim num .
   i = 2
   while i <= sqrt num
      if num mod i = 0
         return 0
      .
      i += 1
   .
   return 1
.
func gcd a b .
   while b <> 0
      h = b
      b = a mod b
      a = h
   .
   return a
.
func sumdiv num .
   d = 2
   repeat
      quot = num div d
      until d > quot
      if num mod d = 0
         sum += d
         if d <> quot
            sum += quot
         .
      .
      d += 1
   .
   return sum + 1
.
func isduff n .
   if isprim n = 0 and gcd sumdiv n n = 1
      return 1
   .
   return 0
.
proc duffs . .
   print "First 50 Duffinian numbers:"
   n = 4
   repeat
      if isduff n = 1
         write n & " "
         cnt += 1
      .
      until cnt = 50
      n += 1
   .
   cnt = 0
   n = 4
   print "\n\nFirst 15 Duffinian triplets:"
   repeat
      if isduff n = 1 and isduff (n + 1) = 1 and isduff (n + 2) = 1
         print n & " - " & n + 2
         cnt += 1
      .
      until cnt = 15
      n += 1
   .
.
duffs
