@Sergey
Here is the code for Airy(x) function written in Java.This program calculates the value of Airy function up to 225 decimal places.
package arbitrary_precision_functions_lib;
import java.math.BigDecimal;
import arbitrary_precision_functions_lib.HelperMethods;
public class ArbitraryPrecisionAi implements Runnable{
private BigDecimal[]a;
private Thread[]threads;
private BigDecimal result;
private int size,numofThreads;
private int startLoop,currLoop,endLoop;
private class AiRange{
public int start,end;
}
public ArbitraryPrecisionAi(int size,int numofThreads){
this.size = size;
this.numofThreads = numofThreads;
a = new BigDecimal[size];
threads = new Thread[numofThreads];
startLoop = currLoop = 0;
endLoop = size;
}
private synchronized AiRange getAiRange(){
AiRange ar = new AiRange();
if(currLoop > endLoop)
return null;
ar.start = currLoop;
currLoop += (endLoop - startLoop)/numofThreads+1;
ar.end = (currLoop < endLoop)?currLoop:endLoop;
return ar;
}
public void run(){
AiRange ar2;
while((ar2 = getAiRange()) != null){
multiThreadedAi(ar2.start,ar2.end,0.001);
System.out.println("Current thread = " + Thread.currentThread() + " ");
}
}
public void multiThreadedAi(int start,int end,double inc){
if( inc == 0.0)
throw new IllegalArgumentException("arg inc cannot be equal to zero");
double x;
x = 0;
BigDecimal sum = BigDecimal.ZERO;
BigDecimal term1 = BigDecimal.ZERO;
BigDecimal term2 = BigDecimal.ZERO;
for(int i = start;i < end;i++){
x += inc;
BigDecimal x1 = BigDecimal.valueOf(x);
BigDecimal x2 = x1;
BigDecimal c1 = BigDecimal.valueOf( 0.355028053887817);
BigDecimal c2 = BigDecimal.valueOf(0.258819403792807);
//double f_part,g_part,f_arg,g_arg,c1,c2;
BigDecimal fcoef1 = new BigDecimal("0.1666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667");
BigDecimal fcoef2 = new BigDecimal("0.005555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555556");
BigDecimal fcoef3 = new BigDecimal("0.00007716049382716049382716049382716049382716049382716049382716049382716049382716049382716049382716049383");
BigDecimal fcoef4 = new BigDecimal("5.845491956603067714178825289936401047512158623269734380845491956603067714178825289936401047512158623e-7");
BigDecimal fcoef5 = new BigDecimal("2.783567598382413197228012042826857641672456487271302086116900931715746530561345376160190975005789821e-9");
BigDecimal fcoef6 = new BigDecimal("9.096626138504618291594810597473390985857700938795104856591179515410936374383481621438532598058136669e-12");
BigDecimal fcoef7 = new BigDecimal("2.165863366310623402760669189874616901394690699713120203950280837002603898662733719390126809061461112e-14");
BigDecimal fcoef8 = new BigDecimal("3.923665518678665584711357228033726270642555615422319210054856588772833149751329201793707987430183173e-17");
BigDecimal fcoef9 = new BigDecimal("5.589267120624879750301078672412715485245805719974813689536832747539648361469129917085054113148409079e-20");
BigDecimal fcoef10 = new BigDecimal("6.424444966235493965863308818865190212926213471235418033950382468436377426976011398948338061090125378e-22");
BigDecimal fcoef11 = new BigDecimal("6.083754702874520801006921229985975580422550635639600410937862186019296805848495642943501951789891456e-25");
BigDecimal fcoef12 = new BigDecimal("4.828376748313111746830889865068234587636944948920317786458620782554997464959123526145636469674517029e-28");
BigDecimal gcoef1 = new BigDecimal("0.08333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333");
BigDecimal gcoef2 = new BigDecimal("0.001984126984126984126984126984126984126984126984126984126984126984126984126984126984126984126984126984");
BigDecimal gcoef3 = new BigDecimal("0.00002204585537918871252204585537918871252204585537918871252204585537918871252204585537918871252204585538");
BigDecimal gcoef4 = new BigDecimal("1.413195857640302084746529190973635418079862524306968751413195857640302084746529190973635418079862524e-7");
BigDecimal gcoef5 = new BigDecimal("5.888316073501258686443871629056814241999427184612369797554982740167925353110538295723480908666093851e-10");
BigDecimal gcoef6 = new BigDecimal("1.737381935562572339700344898525535302663307861488498265626270824451461228589233787414424191552196750e-12");
BigDecimal gcoef7 = new BigDecimal("3.760566960092147921429317962176483339098068964260818756766819966345154174435570968429489592104321971e-15");
BigDecimal gcoef8 = new BigDecimal("6.267611600153579869048863270294138898496781607101364594611366610575256957392618280715815986840536618e-18");
BigDecimal gcoef9 = new BigDecimal("8.290491534594682366466750357531929759916377787171117188639373823512244652635738466555312151905471716e-21");
BigDecimal gcoef10 = new BigDecimal("8.914507026445895017706183180141859956899330953947437837246638519905639411436277921027217367640292168e-24");
BigDecimal gcoef11 = new BigDecimal("7.945193428204897520237239910999875184402255752181317145496112762839250812331798503589320292014520649e-27");
BigDecimal gcoef12 = new BigDecimal("5.964859931084757898076005939189095483785477291427415274396481053182620729978827705397387606617507995e-30");
BigDecimal f_arg = BigDecimal.valueOf(0);
BigDecimal g_arg = BigDecimal.valueOf(0);
BigDecimal f_part = BigDecimal.valueOf(0);
BigDecimal g_part = BigDecimal.valueOf(0);
BigDecimal one = BigDecimal.ONE;
f_arg = x1.pow(3);
g_arg = x1.pow(4);
// Example of Horner scheme polynomial multiplication for BigDecimal polynomial
f_part = one.add(f_arg.multiply(fcoef1)).add(f_arg.multiply(fcoef2)).add(f_arg.multiply(fcoef3)).add(f_arg.multiply(fcoef4)).add(f_arg.multiply(fcoef5)).add(f_arg.multiply(fcoef6)).add(f_arg.multiply(fcoef7)).add(f_arg.multiply(fcoef8)).add(f_arg.multiply(fcoef9)).add(f_arg.multiply(fcoef10)).add(f_arg.multiply(fcoef11)).add(f_arg.multiply(fcoef12));
g_part = x2.add(g_arg.multiply(gcoef1)).add(g_arg.multiply(gcoef2)).add(g_arg.multiply(gcoef3)).add(g_arg.multiply(gcoef4)).add(g_arg.multiply(gcoef5)).add(g_arg.multiply(gcoef6)).add(g_arg.multiply(gcoef7)).add(g_arg.multiply(gcoef8)).add(g_arg.multiply(gcoef9)).add(g_arg.multiply(gcoef10)).add(g_arg.multiply(gcoef11)).add(g_arg.multiply(gcoef12));
term1 = c1.multiply(f_part);
term2 = c2.multiply(g_part);
sum = term1.subtract(term2);
a = sum;
}
}
public BigDecimal[] getBigDecimalAi(){
for(int i = 0;i < numofThreads;i++){
threads = new Thread(this);
threads.setName(Integer.toString(i));
threads.start();
System.out.println("Active threads =" + Thread.activeCount() + " "
+ "names = " + threads.getName() + " " + " threads status = " + threads.getState()
+ " ");
}
for(int i = 0;i < numofThreads;i++){
try{
threads.join();
}catch(InterruptedException e){
e.printStackTrace();
}
}
return a;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BigDecimal[]test;
ArbitraryPrecisionAi ap = new ArbitraryPrecisionAi(10,2);
long start,end;
start = System.nanoTime();
test = ap.getBigDecimalAi();
end = System.nanoTime();
for(int i = 0;i < test.length;i++){
System.out.println("test = " + test + " " + " precision = " + test.precision() + " " );
}
System.out.println("running time is = " + (end - start));
}
}