Integer roots: Difference between revisions
Content added Content deleted
(→{{header|Phix}}: bigatom -> mpfr) |
|||
Line 665: | Line 665: | ||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
{{ |
{{libheader|mpfr}} |
||
<lang Phix>include |
<lang Phix>include mpfr.e |
||
function integer_root(integer n, object |
function integer_root(integer n, object A) |
||
-- yields the nth root of A, adapted from https://en.wikipedia.org/wiki/Nth_root_algorithm |
|||
bigatom r = BA_ONE |
|||
mpz res = mpz_init(1), |
|||
x = mpz_init(), |
|||
delta = mpz_init() |
|||
A = mpz_init(A) |
|||
while true do |
while true do |
||
mpz_set(x,A) |
|||
mpz_pow_ui(delta,res,n-1) |
|||
mpz_fdiv_q(x, x, delta) |
|||
mpz_sub(delta,x,res) |
|||
{} = mpz_fdiv_q_ui(delta, delta, n) |
|||
if delta= |
if mpz_cmp_si(delta,0)=0 then exit end if |
||
mpz_add(res,res,delta) |
|||
end while |
end while |
||
return |
return mpz_get_str(res) |
||
end function |
end function |
||
printf(1,"3rd root of 8 = %s\n", {integer_root(3,8)}) |
printf(1,"3rd root of 8 = %s\n", {integer_root(3,8)}) |
||
printf(1,"3rd root of 9 = %s\n", {integer_root(3,9)}) |
printf(1,"3rd root of 9 = %s\n", {integer_root(3,9)}) |
||
string s = integer_root(2," |
string s = integer_root(2,"2"&repeat('0',4000)) |
||
printf(1,"First digits of the square root of 2: %s\n", {shorten(s)}) |
|||
integer l = length(s) |
|||
s = integer_root(3,"2"&repeat('0',6000)) |
|||
s[20..-20] = " ... " |
|||
printf(1,"First |
printf(1,"First digits of the cube root of 2: %s\n", {shorten(s)})</lang> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
3rd root of 8 = 2 |
3rd root of 8 = 2 |
||
3rd root of 9 = 2 |
3rd root of 9 = 2 |
||
First |
First digits of the square root of 2: 1414213562373095048...7107578486024636008 (2001 digits) |
||
First digits of the cube root of 2: 1259921049894873164...2546828353183047061 (2001 digits) |
|||
</pre> |
</pre> |
||