Code covered by the BSD License  

Highlights from
Variable Precision Integer Arithmetic

  • demo_vpi
  • base2vpi(B,base) bin2vpi: converts an integer in an arbitrary base into vpi (decimal) form
  • bin2vpi(B) bin2vpi: converts a binary representation of an integer into vpi (decimal) form
  • binomfactors(n,k) binomfactors: list all factors of the binomial coefficient nchoosek(n,k)
  • catdigits(N,M) catdigits: concatenates the digits of N and M into an aggregate number
  • createPrimesList createPrimesList - For users of older matlab releases, this function will generate a compatible _primeslist_ file
  • factorialfactors(n) factorialfactors: efficient computation of the prime factors of factorial(n)
  • fibonacci(n) fibonacci: vpi tool to efficiently compute the n'th Fibonacci number and the n'th Lucas number
  • getprimeslist loads the primeslist file, and decompresses it, returning the list of primes up to 2^26
  • ispalindrome(N) ispalindrome: test if the number N (vpi or numeric, or a digit string as a vector) is a palindrome
  • iszero(INT) vpi/iszero: test to see if a numeric object is zero
  • legendresymbol(a,p) legendresymbol: computes the legendre symbol (a/p) for prime p
  • lineardiophantine(A,B,C) lineardiophantine: solve the linear Diophantine equation, A*x + B*y = C
  • mersenne(p) mersenne: identify whether 2^p-1 is a Mersenne prime, using the Lucas-Lehmer test
  • minv(a,p)
  • modfibonacci(n,modulus) fibonacci: compute the n'th Fibonacci number and the n'th Lucas number, all modulo a given value
  • modrank(A,p) modrank: compute the rank of an integer array, modulo p
  • modroot(a,p)
  • modsolve(A,rhs,p)
  • nextprime(N,direction,kprimes) nextprime: finds the next larger prime number directly above (or below) N
  • numberOfPartitions(N) numberOfPartitions: compute the number of partitions of the positive integer n
  • powermod(a,d,n) vpi/powermod: Compute mod(a^d,n)
  • quadraticresidues(N) quadraticresidues: returns a list of the possible quadratic residues of the integer N
  • quotient(numerator,denominato... quotient: divides two integers, computing a quotient and remainder
  • subfactorial(N) subfactorial: The subfactorial of an integer (or integers) N, known as !N
  • totient(N) vpi/totient: the number of positive integers less than N that are coprime to N
  • vpi(N) vpi: Creator function for a variable precision integer
  • View all files
from Variable Precision Integer Arithmetic by John D'Errico
Arithmetic with integers of fully arbitrary size. Arrays and vectors of vpi numbers are supported.

subfactorial(N)
function F = subfactorial(N)
% subfactorial: The subfactorial of an integer (or integers) N, known as !N
% usage: F = subfactorial(N)
%
% One of the uses of the subfactorial function is
% for the number of derangements of a set of size N,
% i.e., the number of permutations that leave no
% element fixed in place.
%
% http://en.wikipedia.org/wiki/Subfactorial
% http://www.research.att.com/~njas/sequences/index.html?q=derangements&language=english&go=Search
%
% F = factorial(N)*sum(-1^k/factorial(k)),
%
% where the sum above goes from 0 to N.
% subfactorial is vectorized, in the sense
% that the computation is done efficiently
% for vector arguments N.
%
% Arguments:
%  N - any non-negative integer scalar or vector.
%      (Don't forget that the subfactorial
%      function gets huge amaingly fast,
%      almost as quickly as does the factorial 
%      function.) So while there is no upper
%      limit imposed on the size of N, there is
%      a practical limit.
%
%  F - a vpi array of the same size and shape
%      as N, such that F(i) = subfactorial(N(i))
%
% Example:
%  N = [0 1 2 3 4 5 10 15 30]';
%  [N,subfactorial(N)]
% ans =
%     0                                  1
%     1                                  0
%     2                                  1
%     3                                  2
%     4                                  9
%     5                                 44
%    10                            1334961
%    15                       481066515734
%    30   97581073836835777732377428235481
%
% See also: factorial, factorial, nchoosek
%
% Author: John D'Errico
% e-mail: woodchips@rochester.rr.com
% Release: 1.0
% Release date: 6/30/09

% if it was vpi, just convert to a double.
if isa(N,'vpi')
  N = double(N);
end

% pre-allocate F
Nsize = size(N);
N = N(:);
F = repmat(vpi(0),Nsize);

% verify that N is non-negative, integer
if any(N < 0) || any(N ~= round(N))
  error('VPI:SUBFACTORIAL:invalidargument','N must be non-negative, integer')
end

% sort the input, so we can do the vectorized
% computation using a recurrence.
[N,Ntags,Ntags] = unique(N);

k = (N == 0);
if any(k)
  F(k) = 1;
end
k = (N == 1);
if any(k)
  F(k) = 0;
end

% if 
L = find(N > 1,1,'first');
if ~isempty(L)
  anm2 = vpi(1);
  anm1 = anm2;
  
  for n = 2:N(end)
    an = n*anm1 + (n-1)*anm2;
    
    if n == N(L)
      F(n == N) = (n-1)*anm2;
      
      if L < numel(N)
        L = L + 1;
      end
    end
    
    anm2 = anm1;
    anm1 = an;
  end
  
end

% recover the original order of N
F = reshape(F(Ntags),Nsize);

Contact us at files@mathworks.com