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.

legendresymbol(a,p)
function S = legendresymbol(a,p)
% legendresymbol: computes the legendre symbol (a/p) for prime p
% usage: S = legendresymbol(a,p)
%
% arguments: (input)
%  a - scalar integer or vpi number
%  p - positive scalar integer or vpi number
%
% arguments: 
%  S - a scalar (double) integer
%
%      =  0, if mod(a,p) = 0
%      = +1, if there exists x such that mod(x^2,p) == a
%      = -1, if there does not exist an x such that mod(x^2,p) == a
%
%
% Example:
% Pick a small prime p, so that we can easily
% list all possible quadratic residues.
%  
%  p = 17;
%  quadraticresidues(p)
% ans =
%      0  1  2  4  8  9 13 15 16
%
% For if a is an integer multiple of p, then
% the legendre symbol is zero.
%
%  legendresymbol(34,p)
% ans =
%      0
%
% 4 is indeed a quadratic residue
%  legendresymbol(4,p)
% ans =
%      1
% 
% 11 is not a quadratic residue
%  legendresymbol(11,p)
% ans =
%     -1
%
%
% Example:
% Pick a random large prime p. (Yes, it is a prime.)
%  p = vpi('1198112137');
%
% Pick some other random number x.
%  x = vpi(4652356);
%
%  x^2
% ans =
%    21644416350736
%
%  a = mod(x^2,p)
% a =
%    520595831
%
% See that the legendre symbol (a/p) is 1, indicating
% that there exists an (unspecified) integer x such
% that mod(x^2,p) == a. Of course, we know this to
% be true, since we have constructed a from a known x.
%
%  legendresymbol(a,p)
% ans =
%      1
%
% However, for this value of a, there does not exist
% an x such that mod(x^2,p) == a+1.
% 
%  legendresymbol(a+1,p)
% ans =
%     -1
%
%
% See also: quadraticresidues, powermod, mod, rem, power, factor, isprime
%
% Author: John D'Errico
% e-mail: woodchips@rochester.rr.com
% Release: 1.0
% Release date: 2/9/09

% we need vpi numbers here
a = vpi(a);
p = vpi(p);

if p <= 1
  error('p must be prime and at least 2')
end

% if p is not prime, then the Jacobi symbol applies here
if ~isprime(p,2)
  % p was not a prime number
  error('p must be prime. Use jacobisymbol for composite p')
end

% there are a few special cases to look at.
if p == 2
  % do we have p == 2?
  % if a is even, then the legendre symbol is zero.
  % if a is odd, then a is a quadratic residue.
  if iseven(a)
    S = 0;
  else
    S = 1;
  end
elseif iszero(mod(a,p))
  % reduce a modulo p to check if the result is zero
  % if the mod is zero, then so is the Legendre symbol.
  S = 0;
else
  % p must now be an odd prime.
  % simplest is just to use little Fermat, which
  % will generate either +1 or p-1 (mod p)
  S = powermod(a,(p-1)/2,p);
  if S == 1
    % S was 1, therefore a was a quadratic residue mod p
    S = 1;
  else
    % S must be p-1, which is equivalent to -1 (mod p)
    S = -1;
  end
end



Contact us at files@mathworks.com