alias base2 {
var %a 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ, %i -1, %t 0, %r
while ($mid($1,%i,1) >= 0) var %v $v1,%pos $pos(%a,%v) - 1,%pow $pow_($2,$calc((%i + 1) * -1)),%m $multiply_(%pow,%pos),%t $add_(%t,%m),%i %i - 1
if ($3 == 10) return %t
while %t >= 1 {
%i = $mod_(%t,$3) + 1
%r = $mid(%a,%i,1) $+ %r
%t = $divide_(%t,$3)
}
return %r
}
alias divide_ {
var %res, %idx 1, %temp = $mid($1,1,1)
while (%temp < $2) {
inc %idx
%temp = $calc(%temp * 10 + $mid($1,%idx,1));
}
while ($mid($1,%idx,1) != $null) {
%res = %res $+ $int($calc(%temp / $2))
inc %idx
%temp = $calc((%temp % $2) * 10 + $mid($1,%idx,1))
}
if ($len(%res) == 0) return 0
return %res
}
alias pow_ {
if ($2 == 0) return 1
var %temp $1,%n $2 - 1,%r $1
while (%n) {
%r = $multiply_(%r,%temp)
dec %n
}
return %r
}
alias add_ {
if ($len($2) > $len($1)) tokenize 32 $2 $1
set -l %result
set -l %carryover
set -l %temp
while ($right($1,15) isnum) {
%temp = $base($calc($v1 + $right($2,15) + %carryover),10,10,$len($v1))
%carryover = $mid(%temp,1-,-15)
%result = $right(%temp,15) $+ %result
tokenize 32 $mid($1,1-,-15) $mid($2,1-,-15)
}
return %result
}
alias mod_ {
var %res 0,%a 1
while ($mid($1,%a,1) != $null) {
%res = $calc(%res * 10 + $v1) % $2
inc %a
}
return %res
}
alias multiply_ {
if ($len($2) > $len($1)) tokenize 32 $2 $1
set -l %temp
set -l %result
set -l %multiplicand $1
set -l %multiplier
set -l %remaining
set -l %interval
set -l %padding
set -l %carryover
tokenize 1 $2
while ($1 isnum) {
%multiplier = $right($1,7)
%remaining = $mid($1,1-,-7)
%carryover = 0
if (%multiplier > 0) {
tokenize 1 %multiplicand
while ($right($1,7) isnum) {
%temp = $base($calc($v1 * %multiplier + %carryover),10,10,$len($v1))
%carryover = $mid(%temp,1-,-7)
%interval = $right(%temp,7) $+ %interval
tokenize 1 $mid($1,1-,-7)
}
if (%carryover) %interval = %carryover $+ %interval
%result = $add_(%result,%interval $+ %padding)
}
%padding = %padding $+ $str(0,$len(%multiplier))
tokenize 1 %remaining
}
return %result
}