view general/numerical/scalar/deta.m @ 61:eff6bddf82e3 tip

Finally implemented perceptual brightness thing.
author samer
date Sun, 11 Oct 2015 10:20:42 +0100
parents db7f4afd27c5
children
line wrap: on
line source
function [f] = deta(z,k)
% deta - Calculates Dirichlet functions of the form
%
%       f = sum((-1)^n/(k*n+1)^z)
%
%       over the entire complex plane
%       Z may be complex and any size
%       Best accuracy for Abs(z) < 100
%
%       Usage: f = deta(z)
%          or  f = deta(z,k)
%
%       where k determines which Dirichlet function to sum
%       For Eta (Zeta, Lambda):   k=1
%       For Betad: k=2
% 
%       This function can use a LOT of memory when size(z)
%       is large. Consider using the Memory and Pack commands.
%       Also, consider breaking z up into smaller chunks.
%
%       Requires a complex Gamma routine.
%       Tested under version 5.3.1
%  
%see also:  Zeta, Eta, Lambda, Betad
%see also:  sym/zeta.m
%see also:  mhelp zeta

%Andrew Odlyzko has Riemann Zeta critical line zeros listed on:
%http://www.research.att.com/~amo/zeta_tables/index.html

%Paul Godfrey
%pgodfrey@conexant.com
%March 24, 2001

if nargin==1
   k=1;
end
k=k(1);
if k<1 | k>2
   warning('Unknown function being calculated! Results valid only for Real(z)>0.5')
% k=1 --> Eta --> Zeta or Lambda --> Bern numbers
% k=2 --> Betad --> Euler numbers
end

[sizz]=size(z);
z=z(:).'; % make z a row vector
rz=real(z);
iz=imag(z);
iszero=find(z==0);
iseven=find(z==(round(z/2)*2)       & rz<0 & iz==0);
isodd= find(z==(round((z-1)/2)*2+1) & rz<0 & iz==0);
 
r=1/2; % reflection point
L=find(rz< r);
if ~isempty(L)
   zL=z(L);
   z(L)=1-zL;
end

%series coefficients were calculated using 
% c(m)=sum from n=m to 64 of (binomial(n,m)/2^n) for m=0:64

%coefficients are symmetrical about the 0.5 value. Each pair sums to +-1
%abs(coefficients) look like erfc(k*m)/2 due to binomial terms
%sum(cm) must = 0.5 = eta(0) = betad(0)
%worst case error occurs for z = 0.5 + i*large

cm= [ .99999999999999999997;
     -.99999999999999999821;
      .99999999999999994183;
     -.99999999999999875788;
      .99999999999998040668;
     -.99999999999975652196;
      .99999999999751767484;
     -.99999999997864739190;
      .99999999984183784058;
     -.99999999897537734890;
      .99999999412319859549;
     -.99999996986230482845;
      .99999986068828287678;
     -.99999941559419338151;
      .99999776238757525623;
     -.99999214148507363026;
      .99997457616475604912;
     -.99992394671207596228;
      .99978893483826239739;
     -.99945495809777621055;
      .99868681159465798081;
     -.99704078337369034566;
      .99374872693175507536;
     -.98759401271422391785;
      .97682326283354439220;
     -.95915923302922997013;
      .93198380256105393618;
     -.89273040299591077603;
      .83945793215750220154;
     -.77148960729470505477;
      .68992761745934847866;
     -.59784149990330073143;
      .50000000000000000000;
     -.40215850009669926857;
      .31007238254065152134;
     -.22851039270529494523;
      .16054206784249779846;
     -.10726959700408922397;
      .68016197438946063823e-1;
     -.40840766970770029873e-1;
      .23176737166455607805e-1;
     -.12405987285776082154e-1;
      .62512730682449246388e-2;
     -.29592166263096543401e-2;
      .13131884053420191908e-2;
     -.54504190222378945440e-3;
      .21106516173760261250e-3;
     -.76053287924037718971e-4;
      .25423835243950883896e-4;
     -.78585149263697370338e-5;
      .22376124247437700378e-5;
     -.58440580661848562719e-6;
      .13931171712321674741e-6;
     -.30137695171547022183e-7;
      .58768014045093054654e-8;
     -.10246226511017621219e-8;
      .15816215942184366772e-9;
     -.21352608103961806529e-10;
      .24823251635643084345e-11;
     -.24347803504257137241e-12;
      .19593322190397666205e-13;
     -.12421162189080181548e-14;
      .58167446553847312884e-16;
     -.17889335846010823161e-17;
      .27105054312137610850e-19];

cm=flipud(cm).'; % sum from small to big 
nmax=size(cm,2);
n=(1:k:k*nmax)';
n=flipud(n);
% z is a  LR vector
% n is an UD vector
[Z,N]=meshgrid(z,n);

% this can take a LOT of memory
f=cm*(N.^-Z);
% but it's really fast to form the series expansion N.^-Z
% and then sum it by an inner product cm*()  :)

%reflect across 1/2
if ~isempty(L)
    zz=z(L);
    if k==1
    % Eta function reflection
    % for test: deta(1,1) should = log(2)
      t=(2-2.^(zz+1))./(2.^zz-2)./pi.^zz;
      f(L)=t.*cos(pi/2*zz).*gamma(zz).*f(L);
      if ~isempty(iszero)
         f(iszero)=0.5;
      end
      if ~isempty(iseven)
         f(iseven)=0;
      end
    end
    if k==2
    % Betad function reflection
    %for test: deta(0,2) should = 0.5
    %for test: deta(1,2) should = pi/4
      f(L)=(2/pi).^zz.*sin(pi/2*zz).*gamma(zz).*f(L);
      if ~isempty(isodd)
         f(isodd)=0;
      end
    end
    if k>2
    % Insert reflection formula for other Dirichlet functions here
      f(L)=(1/pi).^zz.*gamma(zz).*f(L);
      f(L)=NaN;
    end
end

f = reshape(f,sizz);
return