primorial.frink

View or download primorial.frink in plain text format


/** This program calculates primorial numbers.  A primorial is the product
    of primes.

    primorial[0] = 1 (by definition)
    primorial[1] = 2
    primorial[2] = 6
    primorial[3] = 30

    This does not do any caching of results.
*/

primorial[n] := product[first[primes[], n]]

/** This is a recursive algorithm that splits the results into an upper and
    lower half and multiplies in stages.  This is much faster for large
    numbers. */

primorialSplitting[n] :=
{
   if n == 0
      return 1
   primes = array[first[primes[], n]]
   return primorialSplitting[n, 0, n-1, primes]
}

/** The actual recursive algorithm. */
primorialSplitting[n, begin, end, primes] :=
{
   range = (end-begin)
   if range >= 2
   {
      middle = (begin + end) div 2
      return primorialSplitting[n, begin, middle, primes] * primorialSplitting[n, middle+1, end, primes]
   }
   if range == 1
      return primes@begin * primes@end

   if range == 0
      return primes@begin
}

/** Rosetta code tests.

    https://rosettacode.org/wiki/Primorial_numbers
*/


for n = 0 to 9
   println["primorial[$n] = " + primorialSplitting[n]]

for n = [10, 100, 1000, 10000, 100000, million]
   println["Length of primorial $n is " + length[toString[primorialSplitting[n]]] + " decimal digits."]


View or download primorial.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 18663 days, 2 hours, 29 minutes ago.