Rでガウスの超幾何関数 hypergeometric function

Rでガウスの超幾何関数を計算する。
hypergeo 関数は一部パラメータでバグがあるのでgslの超幾何関数でおきかえる。
ただし、gslの超幾何関数は複素数に解析接続されていないので、そこはhypergeoを使う。

library("hypergeo")
library(gsl)
library("BAS")
###2017.03.09
#beta5<-0.4

Gauss2F1 <- function(a,b,c,x){
		
    if(abs(Re(x))>=0 & abs(Re(x))<1){
	if(x<0){
		##For a==b and a<0, are there the bugs in hyperg_2F1, in which sign is reversed?
			#-hyperg_2F1(a,c-b,c,1-1/(1-x))/(1-x)^a
		if(a==b & a<0){
	      	 hyperg_2F1(a,b,c,x)

		}else{
			 hyperg_2F1(a,b,c,x)


		}
	}else{
	      #hypergeo(c-a,b,c,1-1/(1-x))/(1-x)^b
		 hypergeo(a,b,c,x)

	} 	  
    }else{
	if(Re(1-1/(1-x))>0){
        # hyperg_2F1(c-a,b,c,1-1/(1-x))/(1-x)^b
	   
		if(a!=b){
			#hyperg_2F1(a,c-b,c,1-1/(1-x))/(1-x)^a
	 		hyperg_2F1(c-a,b,c,1-1/(1-x))/(1-x)^b
		}else{	
			##For a==b and a<0, are there the bugs in hyperg_2F1, in which sign is reversed?
			#-hyperg_2F1(a,c-b,c,1-1/(1-x))/(1-x)^a
			if(a<0){
				-hyperg_2F1(c-a,b,c,1-1/(1-x))/(1-x)^b
			}else{
				hyperg_2F1(c-a,b,c,1-1/(1-x))/(1-x)^b
			}
		}
		 #coef1=gamma(c)*gamma(b-a)*(1-x)^-a/(gamma(b)*gamma(c-a));     
	  #coef2=gamma(c)*gamma(a-b)*(1-x)^-b/(gamma(a)*gamma(c-b));       
	  #coef1*hyperg_2F1(a,c-b,a-b+1,1/(1-x))+coef2*hyperg_2F1(b,c-a,b-a+1,1/(1-x));


	}else{
          #hypergeo(c-a,b,c,1-1/(1-x))/(1-x)^b 
	  hypergeo(a,b,c,x)
	}
    }	
}