# primorial.frink

``` /** This program calculates primorial numbers.  A primorial is the product     of primes.     primorial = 1 (by definition)     primorial = 2     primorial = 6     primorial = 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."] ```