Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Great then $bignum_gt(N,N)
- ; Addition $bignum_add(N,N)
- ; Subtraction $bignum_sub(N,N)
- ; Multiplication $bignum_mul(N,N)
- ; Factorial $bignum_fac(N)
- alias bignum_gt {
- if (!$regex($1,/^[+-]?\d+(\.\d+)?$/)) || (!$regex($2,/^[+-]?\d+(\.\d+)?$/)) return erro
- set -l %n1 $1
- set -l %n2 $2
- if ($left($1,1) == -) || ($v1 == +) {
- %n1 = $right($1,-1)
- set -l %s1 $v1
- }
- if ($left($2,1) == -) || ($v1 == +) {
- %n2 = $right($2,-1)
- set -l %s2 $v1
- }
- tokenize 46 %n1
- set -l %i1 $regsubex($1,/^0+/,)
- set -l %f1 $regsubex($2,/0+$/,)
- tokenize 46 %n2
- set -l %i2 $regsubex($1,/^0+/,)
- set -l %f2 $regsubex($2,/0+$/,)
- if ((%f1) || (%f2)) && ($len(%f1) != $len(%f2)) {
- set -l %fl1 $v1
- set -l %fl2 $v2
- if (%fl1 > %fl2) %f2 = $+(%f2,$str(0,$calc(%fl1 - %fl2)))
- else %f1 = $+(%f1,$str(0,$calc(%fl2 - %fl1)))
- }
- %n1 = $+(x,%i1,%f1)
- %n2 = $+(x,%i2,%f2)
- if (%n1 == x) || (%n2 == x) {
- if (%n1 == x) && (%n2 == x) return $false
- if (%n1 == x) && (%s2 == -) return $true
- if (%n2 == x) && (%s1 != -) return $true
- return $false
- }
- if (%s1 == -) && ((!%s2) || (%s2 == +)) return $false
- if (%s2 == -) && ((!%s1) || (%s1 == +)) return $true
- if (%n1 == %n2) return $false
- if (%s1 == -) {
- if ($len(%n1) < $len(%n2)) return $true
- if ($v1 == $v2) && (%n1 < %n2) return $true
- }
- else {
- if ($len(%n1) > $len(%n2)) return $true
- if ($v1 == $v2) && (%n1 > %n2) return $true
- }
- return $false
- }
- alias bignum_toknum {
- set -l %l $len($1)
- set -l %r
- if ($calc(%l % $2) > 0) {
- %r = $left($1,$v1)
- tokenize 32 $right($1,$+(-,$v1)) $2
- if ($len($1)) %l = $v1
- else return %r
- }
- set -l %x 1
- :l
- %r = $instok(%r,$mid($1,%x,$2),1,95)
- inc %x $2
- if (%x <= %l) goto l
- return %r
- }
- alias bignum_fac {
- if (!$regex(numero,$1,/^\+?(\d+)$/)) return erro
- if ($regml(numero,1) isnum 0-21) return $calc($regsubex($str(.*,$v1),/\./g,\n)1)
- set -l %x 22
- set -l %y 51090942171709440000
- :l
- %y = $_mul(%x,%y)
- inc %x
- if (%x <= $regml(numero,1)) goto l
- return %y
- }
- alias bignum_sub {
- if (!$regex($1,/^[+-]?\d+(\.\d+)?$/)) || (!$regex($2,/^[+-]?\d+(\.\d+)?$/)) return erro
- set -l %n1 $regsubex(sign1,$1,/^([+-])/,)
- set -l %n2 $regsubex(sign2,$2,/^([+-])/,)
- set -l %s $regml(sign1,1)
- set -l %s2 -
- if (%s == +) %s = $null
- if ($regml(sign2,1) == -) %s2 = $null
- if ((%s == -) && (%s2 == -)) || ((!%s2) && (!%s)) return $bignum_add($+(%s,%n1),$+(%s2,%n2))
- tokenize 46 %n1
- set -l %i1 $regsubex($1,/^0+/,)
- set -l %f1 $regsubex($2,/0+$/,)
- tokenize 46 %n2
- set -l %i2 $regsubex($1,/^0+/,)
- set -l %f2 $regsubex($2,/0+$/,)
- set -l %f $len(%f1)
- if ((%f1) || (%f2)) && ($len(%f1) != $len(%f2)) {
- set -l %fl1 $v1
- set -l %fl2 $v2
- if (%fl1 > %fl2) %f2 = $+(%f2,$str(0,$calc(%fl1 - %fl2)))
- else %f1 = $+(%f1,$str(0,$calc(%fl2 - %fl1)))
- %f = $len(%f1)
- }
- %n1 = $+(%i1,%f1)
- %n2 = $+(%i2,%f2)
- if (!%n1) && (!%n2) return 0
- if (!%n1) return $bignum_float(%n2,%f,%s)
- if (!%n2) return $bignum_float(%n1,%f,%s2)
- if ($qt(%n1) == $qt(%n2)) return 0
- if ($bignum_gt(%n2,%n1)) return $bignum_float($_sub(%n2,%n1),%f,%s2)
- return $bignum_float($_sub(%n1,%n2),%f,%s)
- }
- alias _sub {
- set -l %n1 $bignum_toknum($1,15)
- set -l %n2 $bignum_toknum($2,15)
- set -l %l $numtok(%n1,95)
- set -l %x 1
- set -l %p 0
- set -l %r
- :l
- tokenize 32 $calc($gettok(%n1,%x,95) - %p) $gettok(%n2,%x,95)
- if ($2 > $1) {
- if ($1 < 0) %r = $+($base($calc($+(1,$base($calc($1 + 1),10,10,15)) - 1 - $2),10,10,15),%r)
- else %r = $+($base($calc($+(1,$base($1,10,10,15)) - $2),10,10,15),%r)
- %p = 1
- }
- else {
- if (!$2) && ($1 < 0) {
- %r = $+($base($calc($+(1,$base($calc($1 + 1),10,10,15)) - 1 - $2),10,10,15),%r)
- %p = 1
- }
- else {
- %p = 0
- %r = $+($base($calc($1 - $2),10,10,15),%r)
- }
- }
- inc %x
- if (%x <= %l) goto l
- return $regsubex(%r,/^0+/,)
- }
- alias _add {
- set -l %n1 $bignum_toknum($1,15)
- set -l %n2 $bignum_toknum($2,15)
- set -l %l $numtok(%n1,95)
- if ($numtok(%n2,95) > %l) %l = $v1
- set -l %x 1
- set -l %p 0
- set -l %r
- set -l %c
- :l
- %c = $calc(%p + $gettok(%n1,%x,95) + $gettok(%n2,%x,95))
- %p = 0
- if ($len(%c) > 15) {
- %c = $right(%c,-1)
- inc %p
- }
- %r = $+($base(%c,10,10,15),%r)
- inc %x
- if (%x <= %l) goto l
- if (%p) %r = $+(1,%r)
- return $regsubex(%r,/^0+/,)
- }
- alias _mul {
- set -l %n1 $bignum_toknum($1,7)
- set -l %n2 $bignum_toknum($2,7)
- set -l %l1 $numtok(%n1,95)
- set -l %l2 $numtok(%n2,95)
- set -l %x 1
- set -l %r 0
- set -l %a $gettok(%n2,1,95)
- set -l %y 1
- set -l %p 0
- set -l %s
- set -l %c
- :l
- %c = $calc((%a * $gettok(%n1,%y,95)) + %p)
- %p = 0
- if ($left(%c,-7)) {
- %p = $v1
- %c = $right(%c,7)
- }
- %s = $+($base(%c,10,10,7),%s)
- inc %y
- if (%y <= %l1) goto l
- if (%p) %s = $+(%p,%s)
- %r = $_add(%r,$+(%s,$str(0,$calc((%x - 1) * 7))))
- inc %x
- %a = $gettok(%n2,%x,95)
- %y = 1
- %p = 0
- %s = $null
- if (%x <= %l2) goto l
- return %r
- }
- alias bignum_mul {
- if (!$regex($1,/^[+-]?\d+(\.\d+)?$/)) || (!$regex($2,/^[+-]?\d+(\.\d+)?$/)) return erro
- set -l %n1 $regsubex(sign1,$1,/^([+-])/,)
- set -l %n2 $regsubex(sign2,$2,/^([+-])/,)
- if (($regml(sign1,1) == -) && (($regml(sign2,1) == +) || (!$v1))) || (($regml(sign2,1) == -) && (($regml(sign1,1) == +) || (!$v1))) set -l %sign -
- tokenize 46 %n1
- set -l %i1 $regsubex($1,/^0+/,)
- set -l %f1 $regsubex($2,/0+$/,)
- tokenize 46 %n2
- set -l %i2 $regsubex($1,/^0+/,)
- set -l %f2 $regsubex($2,/0+$/,)
- set -l %f $calc($len(%f1) + $len(%f2))
- %n1 = $+(%i1,%f1)
- %n2 = $+(%i2,%f2)
- if (!%n1) || (!%n2) return 0
- if ($len(%n2) > $len(%n1)) return $bignum_float($_mul(%n2,%n1),%f,%sign)
- return $bignum_float($_mul(%n1,%n2),%f,%sign)
- }
- alias bignum_add {
- if (!$regex($1,/^[+-]?\d+(\.\d+)?$/)) || (!$regex($2,/^[+-]?\d+(\.\d+)?$/)) return erro
- set -l %n1 $regsubex(sign1,$1,/^([+-])/,)
- set -l %n2 $regsubex(sign2,$2,/^([+-])/,)
- if (($regml(sign1,1) == -) && (($regml(sign2,1) == +) || (!$v1))) || (($regml(sign2,1) == -) && (($regml(sign1,1) == +) || (!$v1))) return $bignum_sub($1,$2)
- if ($regml(sign1,1) == -) set -l %s -
- tokenize 46 %n1
- set -l %i1 $regsubex($1,/^0+/,)
- set -l %f1 $regsubex($2,/0+$/,)
- tokenize 46 %n2
- set -l %i2 $regsubex($1,/^0+/,)
- set -l %f2 $regsubex($2,/0+$/,)
- set -l %f $len(%f1)
- if ((%f1) || (%f2)) && ($len(%f1) != $len(%f2)) {
- set -l %fl1 $v1
- set -l %fl2 $v2
- if (%fl1 > %fl2) %f2 = $+(%f2,$str(0,$calc(%fl1 - %fl2)))
- else %f1 = $+(%f1,$str(0,$calc(%fl2 - %fl1)))
- %f = $len(%f1)
- }
- %n1 = $+(%i1,%f1)
- %n2 = $+(%i2,%f2)
- if (!%n1) && (!%n2) return 0
- if (!%n1) return $bignum_float(%n2,%f,%s)
- if (!%n2) return $bignum_float(%n1,%f,%s)
- return $bignum_float($_add(%n1,%n2),%f,%s)
- }
- alias bignum_float {
- if ($2 == 0) return $+($3,$1)
- set -l %i $left($1,$+(-,$2))
- set -l %f $regsubex($bignum_lpad0($right($1,$2),$2),/0+$/,)
- if (!%i) %i = 0
- if (%f) return $+($3,%i,.,%f)
- return $+($3,%i)
- }
- alias bignum_lpad0 {
- if ($len($1) < $2) return $+($str(0,$calc($2 - $v1)),$1)
- return $1
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement