Instantly share code, notes, and snippets.

# jj1bdx/bignum_root.erl Created Jan 26, 2010

What would you like to do?
obsolete: see 293169
 %% Power function (X ^ Y) and root function (X ^ (1/Y)) for %% integers in Erlang %% by Kenji Rikitake 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.