#!/usr/bin/ruby

# Author: Daniel "Trizen" Șuteu
# License: GPLv3
# Date: 25 June 2016
# Website: https://github.com/trizen

# Cached method for the computation of the zeta function.

# Based on the following recursive function:
#
#    f(n) = n^p * f(n-1) + ((n-1)!)^p
#    f(1) = 1
#
# zeta(n, p) = f(n) / (n!)^p
#
#===============================
# Also notice that:
#            _n_
#   (n!)^p = | | k^p
#            k=1

var iter = 100                      # iterate this many times
var p = Complex(1/2, 21.022)        # raise each n to this power

func f(n) is cached {
    n.is_one ? 1 : (pow(n, p) * f(n-1) + pow((n-1)!, p))
}

say f(iter)/pow(iter!, p)