Преподаватель требует написать код на Си по параллельному программированию аналогично тому, как он его написал.

Вот его код:
#include "mpi. h"
#include <stdio. h>
#include <math. h>

/// Вычисление ArcSin(x), используя его разложение в ряд Тэйлора
double Abs(double a)
{
if(a <0) return (-a);
return a;

}


int main( int argc, char *argv[])
{

int rank, np; //rank, number of processes
double myas, as; //Part of ArcSin, ArcSin
double eps, x; // argument
double startwtime = 0.0, endwtime;

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&np);
MPI_Comm_rank(MPI_COMM_WORLD,&rank) ;


if( rank == 0)
{

printf("Input x - argument od ArcSin: ((+1)) ");
scanf("%lf",&x);
printf("Input eps - : (10^-5 - 10^-10) ");
scanf("%lf",&eps);
startwtime = MPI_Wtime();

}
MPI_Bcast(&x, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Bcast(&eps, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);

for(int povtor = 0; povtor < 1000000; povtor++)
{
//every process evaluates myas - his part of Sum(ak) = ArcSin(x)
myas = 0.0;
//initial value of a - current number of Sum
int n = rank;
double k = 2*n +1;
double a = x/k;

double p = 1.0;
for(int i = 0; i< n; i++)
{
k = (2*i +1); p *= x*x*k/(k+1);
}
a*=p;
//printf("a0 = %f, rank = %d\n",a, rank);
while (Abs(a) > eps)
{
myas += a;
p =1.0;
for(int i = 1; i <= np; i++)
{
k = 2*(n + i);
p *= x * x *(k-1)/k;
}
a *= p*(2 * n + 1)/(2*(n + np) + 1);
n += np;
//printf("a = %f, rank = %d\n",a, rank);

}
//printf("myas = %f, rank = %d\n",myas, rank);
}
MPI_Reduce(&myas, &as, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

if (rank == 0)
{
printf("Value of ArcSin(%f) = %f\n",
x, as);
endwtime = MPI_Wtime();
printf("Time = %f\n",endwtime-startwtime);
}


MPI_Finalize();
return 0;
}

Говорит, что делал преобразования по формуле

арксин.png|x| <1

Но, как именно он их делает, не ясно в этой части кода

int n = rank;
double k = 2*n +1;
double a = x/k;

double p = 1.0;
for(int i = 0; i< n; i++)
{
k = (2*i +1); p *= x*x*k/(k+1);
}
a*=p;
//printf("a0 = %f, rank = %d\n",a, rank);
while (Abs(a) > eps)
{
myas += a;
p =1.0;
for(int i = 1; i <= np; i++)
{
k = 2*(n + i);
p *= x * x *(k-1)/k;
}
a *= p*(2 * n + 1)/(2*(n + np) + 1);
n += np;

Мне нужно аналогично сделать преобразования для

лнх.png, где 0 < x < 2
Пожалуйста, помогите. Я уже голову себе сломала. Но принципа преобразований не пойму((

Если нельзя сделать именно так, то напишите код, как считаете нужным, но желательно приближенно к такому решению.