Хорхе писал(а):
Гугл рулит. 
Судя по найденным результатам, простого алгоритма нет.
Посмотрел, как считается invphi в Maple. В принципе алгоритм не сложный.
По крайней мере, короткий 
 
Код:
proc (a) local d, divlist, i, j; 
if not type(a,'posint') then return ('procname')(args) end if; 
d := ifactors(a)[2]; 
divlist := sort(map(convert,combinat:-powerset([seq(seq(op(1,d[j]),i = 1 .. op(2,d[j])),j = 1 .. nops(d))]),'`*`')); 
divlist := select(type,divlist,'even'); 
divlist := select(x -> isprime(x+1),divlist); remove(has,sort(map(convert,invrec(a,divlist),'`*`')),FAIL) 
end proc