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 18698 days, 11 hours, 51 minutes ago.