44 lines
941 B
Bash
44 lines
941 B
Bash
add() { # arbitrary-precision addition
|
|
local a="$1" b="$2" sum= carry=0
|
|
if (( ${#a} < ${#b} )); then
|
|
local t="$a"
|
|
a="$b" b="$t"
|
|
fi
|
|
|
|
while (( ${#a} )); do
|
|
local -i d1="${a##${a%?}}" d2="10#0${b##${b%?}}" s=carry+d1+d2
|
|
sum="${s##${s%?}}$sum"
|
|
carry="10#0${s%?}"
|
|
a="${a%?}" b="${b%?}"
|
|
done
|
|
echo "$sum"
|
|
}
|
|
|
|
multiply() { # arbitrary-precision multiplication
|
|
local a="$1" b="$2" product=0
|
|
if (( ${#a} < ${#b} )); then
|
|
local t="$a"
|
|
a="$b" b="$t"
|
|
fi
|
|
|
|
local zeroes=
|
|
while (( ${#b} )); do
|
|
local m1="$a"
|
|
local m2="${b##${b%?}}"
|
|
local partial=$zeroes
|
|
local -i carry=0
|
|
while (( ${#m1} )); do
|
|
local -i d="${m1##${m1%?}}"
|
|
m1="${m1%?}"
|
|
local -i p=d*m2+carry
|
|
partial="${p##${p%?}}$partial"
|
|
carry="10#0${p%?}"
|
|
done
|
|
partial="${carry#0}$partial"
|
|
product="$(add "$product" "$partial")"
|
|
zeroes=0$zeroes
|
|
b="${b%?}"
|
|
done
|
|
echo "$product"
|
|
}
|