package maths import "exp/bignum" var bigOne = bignum.Nat ( uint64 ( 1 ) ) var bigTwo = bignum.Nat ( uint64 ( 2 ) ) func factorial_bignum_iterative ( n uint ) ( total bignum.Natural ) { total = bigOne for i := uint ( 2 ) ; i <= n ; i++ { total = total.Mul ( bignum.Nat ( uint64 ( i ) ) ) } return } func factorial_bignum_recursive ( n uint ) ( value bignum.Natural ) { if n < 2 { value = bigOne } else { value = bignum.Nat ( uint64 ( n ) ).Mul ( factorial_bignum_recursive ( n - 1 ) ) } return } func factorial_bignum_tailRecursiveIterate ( n bignum.Natural , result bignum.Natural ) ( value bignum.Natural ) { if n.Cmp ( bigTwo ) < 0 { value = result } else { value = factorial_bignum_tailRecursiveIterate ( n.Sub ( bigOne ) , result.Mul ( n ) ) } return } func factorial_bignum_tailRecursive ( n uint ) ( value bignum.Natural ) { if n < 2 { value = bigOne } else { value = factorial_bignum_tailRecursiveIterate ( bignum.Nat ( uint64 ( n ) ) , bigOne ) } return }