Integer nth-root (Re: [erlang-questions] Integer square root)

Kenji Rikitake kenji.rikitake@REDACTED
Tue Jan 26 06:16:48 CET 2010


%% This is a quick hack of code for Integer nth-root in Erlang.

%% Power function (X ^ Y) and root function (X ^ (1/Y)) for
%% integers in Erlang
%% by Kenji Rikitake <kenji.rikitake@REDACTED> 26-JAN-2010
%% Distributed under MIT license at the end of the source code.

-module(bignum_root).

-export([power/2, root/2]).

%% significand digits for float estimation
-define(DIGITS, 10).

%% computing N ^ E

power(N, E) when (is_integer(N) and (is_integer(E) and (E >= 0))) ->
    power(N, E, 1, N).

power(_, 0, Acc, _) ->
    Acc;
power(N, E, Acc, Nsq) when (E rem 2 =:= 1) ->
    power(N, E - 1, Acc * Nsq, Nsq);
power(N, E, Acc, Nsq) ->
    power(N, E div 2, Acc, Nsq * Nsq).

%% computing N ^ (1/E)
%% with Newton-Raphson method

root(N, E) when ((is_integer(N) and (N > 0)) and
		  (is_integer(E) and (E >= 2))) ->
    % estimation of the root by the float calc
    L = integer_to_list(N),
    Len = length(L),
    case Len > ?DIGITS of
	true ->
	    Exp = Len - ?DIGITS,
	    M = list_to_integer(lists:sublist(L, ?DIGITS)),
	    XM = math:exp(math:log(M) / E) * math:pow(10, (Exp rem E) / E),
	    XE = list_to_integer([$1] ++ lists:duplicate(Exp div E, $0)),
	    X = trunc(XM) * XE;
	false ->
	    X = trunc(math:exp(math:log(N) / E))
    end,
    root(N, E, X).

root(N, E, X) ->
    % Newton-Raphson method of solving (E)th-root
    X2 = ((N div (power(X, E - 1))) + (X * (E - 1))) div E,
    case X2 =/= X of
	true ->
	    root(N, E, X2);
	false ->
	    X
    end.

%%  MIT License:
%%  Copyright (c) 2010 by Kenji Rikitake.
%%
%%  Permission is hereby granted, free of charge, to any person
%%  obtaining a copy of this software and associated documentation
%%  files (the "Software"), to deal in the Software without
%%  restriction, including without limitation the rights to use,
%%  copy, modify, merge, publish, distribute, sublicense, and/or sell
%%  copies of the Software, and to permit persons to whom the
%%  Software is furnished to do so, subject to the following
%%  conditions:
%%
%%  The above copyright notice and this permission notice shall be
%%  included in all copies or substantial portions of the Software.
%%
%%  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
%%  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
%%  OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
%%  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
%%  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
%%  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
%%  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
%%  OTHER DEALINGS IN THE SOFTWARE.


More information about the erlang-questions mailing list