Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
mIRC 7.15 KB | None | 0 0
  1. ; Great then $bignum_gt(N,N)
  2. ; Addition $bignum_add(N,N)
  3. ; Subtraction $bignum_sub(N,N)
  4. ; Multiplication $bignum_mul(N,N)
  5. ; Factorial $bignum_fac(N)
  6.  
  7. alias bignum_gt {
  8.   if (!$regex($1,/^[+-]?\d+(\.\d+)?$/)) || (!$regex($2,/^[+-]?\d+(\.\d+)?$/)) return erro
  9.   set -l %n1 $1
  10.   set -l %n2 $2
  11.   if ($left($1,1) == -) || ($v1 == +) {
  12.     %n1 = $right($1,-1)
  13.     set -l %s1 $v1
  14.   }
  15.   if ($left($2,1) == -) || ($v1 == +) {
  16.     %n2 = $right($2,-1)
  17.     set -l %s2 $v1
  18.   }
  19.   tokenize 46 %n1
  20.   set -l %i1 $regsubex($1,/^0+/,)
  21.   set -l %f1 $regsubex($2,/0+$/,)
  22.   tokenize 46 %n2
  23.   set -l %i2 $regsubex($1,/^0+/,)
  24.   set -l %f2 $regsubex($2,/0+$/,)
  25.   if ((%f1) || (%f2)) && ($len(%f1) != $len(%f2)) {
  26.     set -l %fl1 $v1
  27.     set -l %fl2 $v2
  28.     if (%fl1 > %fl2) %f2 = $+(%f2,$str(0,$calc(%fl1 - %fl2)))
  29.     else %f1 = $+(%f1,$str(0,$calc(%fl2 - %fl1)))
  30.   }
  31.   %n1 = $+(x,%i1,%f1)
  32.   %n2 = $+(x,%i2,%f2)
  33.   if (%n1 == x) || (%n2 == x) {
  34.     if (%n1 == x) && (%n2 == x) return $false
  35.     if (%n1 == x) && (%s2 == -) return $true
  36.     if (%n2 == x) && (%s1 != -) return $true
  37.     return $false
  38.   }
  39.   if (%s1 == -) && ((!%s2) || (%s2 == +)) return $false
  40.   if (%s2 == -) && ((!%s1) || (%s1 == +)) return $true
  41.   if (%n1 == %n2) return $false
  42.   if (%s1 == -) {
  43.     if ($len(%n1) < $len(%n2)) return $true
  44.     if ($v1 == $v2) && (%n1 < %n2) return $true
  45.   }
  46.   else {
  47.     if ($len(%n1) > $len(%n2)) return $true
  48.     if ($v1 == $v2) && (%n1 > %n2) return $true
  49.   }
  50.   return $false
  51. }
  52.  
  53. alias bignum_toknum {
  54.   set -l %l $len($1)
  55.   set -l %r
  56.   if ($calc(%l % $2) > 0) {
  57.     %r = $left($1,$v1)
  58.     tokenize 32 $right($1,$+(-,$v1)) $2
  59.     if ($len($1)) %l = $v1
  60.     else return %r
  61.   }
  62.   set -l %x 1
  63.   :l
  64.   %r = $instok(%r,$mid($1,%x,$2),1,95)
  65.   inc %x $2
  66.   if (%x <= %l) goto l
  67.   return %r
  68. }
  69.  
  70. alias bignum_fac {
  71.   if (!$regex(numero,$1,/^\+?(\d+)$/)) return erro
  72.   if ($regml(numero,1) isnum 0-21) return $calc($regsubex($str(.*,$v1),/\./g,\n)1)
  73.   set -l %x 22
  74.   set -l %y 51090942171709440000
  75.   :l
  76.   %y = $_mul(%x,%y)
  77.   inc %x
  78.   if (%x <= $regml(numero,1)) goto l
  79.   return %y
  80. }
  81.  
  82. alias bignum_sub {
  83.   if (!$regex($1,/^[+-]?\d+(\.\d+)?$/)) || (!$regex($2,/^[+-]?\d+(\.\d+)?$/)) return erro
  84.   set -l %n1 $regsubex(sign1,$1,/^([+-])/,)
  85.   set -l %n2 $regsubex(sign2,$2,/^([+-])/,)
  86.   set -l %s $regml(sign1,1)
  87.   set -l %s2 -
  88.   if (%s == +) %s = $null
  89.   if ($regml(sign2,1) == -) %s2 = $null
  90.   if ((%s == -) && (%s2 == -)) || ((!%s2) && (!%s)) return $bignum_add($+(%s,%n1),$+(%s2,%n2))
  91.   tokenize 46 %n1
  92.   set -l %i1 $regsubex($1,/^0+/,)
  93.   set -l %f1 $regsubex($2,/0+$/,)
  94.   tokenize 46 %n2
  95.   set -l %i2 $regsubex($1,/^0+/,)
  96.   set -l %f2 $regsubex($2,/0+$/,)
  97.   set -l %f $len(%f1)
  98.   if ((%f1) || (%f2)) && ($len(%f1) != $len(%f2)) {
  99.     set -l %fl1 $v1
  100.     set -l %fl2 $v2
  101.     if (%fl1 > %fl2) %f2 = $+(%f2,$str(0,$calc(%fl1 - %fl2)))
  102.     else %f1 = $+(%f1,$str(0,$calc(%fl2 - %fl1)))
  103.     %f = $len(%f1)
  104.   }
  105.   %n1 = $+(%i1,%f1)
  106.   %n2 = $+(%i2,%f2)
  107.   if (!%n1) && (!%n2) return 0
  108.   if (!%n1) return $bignum_float(%n2,%f,%s)
  109.   if (!%n2) return $bignum_float(%n1,%f,%s2)
  110.   if ($qt(%n1) == $qt(%n2)) return 0
  111.   if ($bignum_gt(%n2,%n1)) return $bignum_float($_sub(%n2,%n1),%f,%s2)
  112.   return $bignum_float($_sub(%n1,%n2),%f,%s)
  113. }
  114.  
  115. alias _sub {
  116.   set -l %n1 $bignum_toknum($1,15)
  117.   set -l %n2 $bignum_toknum($2,15)  
  118.   set -l %l $numtok(%n1,95)
  119.   set -l %x 1
  120.   set -l %p 0
  121.   set -l %r
  122.   :l
  123.   tokenize 32 $calc($gettok(%n1,%x,95) - %p) $gettok(%n2,%x,95)
  124.   if ($2 > $1) {
  125.     if ($1 < 0) %r = $+($base($calc($+(1,$base($calc($1 + 1),10,10,15)) - 1 - $2),10,10,15),%r)
  126.     else %r = $+($base($calc($+(1,$base($1,10,10,15)) - $2),10,10,15),%r)
  127.     %p = 1
  128.   }
  129.   else {
  130.     if (!$2) && ($1 < 0) {
  131.       %r = $+($base($calc($+(1,$base($calc($1 + 1),10,10,15)) - 1 - $2),10,10,15),%r)
  132.       %p = 1
  133.     }
  134.     else {
  135.       %p = 0
  136.       %r = $+($base($calc($1 - $2),10,10,15),%r)
  137.     }
  138.   }
  139.   inc %x
  140.   if (%x <= %l) goto l
  141.   return $regsubex(%r,/^0+/,)
  142. }
  143.  
  144. alias _add {
  145.   set -l %n1 $bignum_toknum($1,15)
  146.   set -l %n2 $bignum_toknum($2,15)
  147.   set -l %l $numtok(%n1,95)
  148.   if ($numtok(%n2,95) > %l) %l = $v1
  149.   set -l %x 1
  150.   set -l %p 0
  151.   set -l %r
  152.   set -l %c
  153.   :l
  154.   %c = $calc(%p + $gettok(%n1,%x,95) + $gettok(%n2,%x,95))
  155.   %p = 0
  156.   if ($len(%c) > 15) {
  157.     %c = $right(%c,-1)
  158.     inc %p
  159.   }
  160.   %r = $+($base(%c,10,10,15),%r)
  161.   inc %x
  162.   if (%x <= %l) goto l
  163.   if (%p) %r = $+(1,%r)
  164.   return $regsubex(%r,/^0+/,)
  165. }
  166.  
  167. alias _mul {
  168.   set -l %n1 $bignum_toknum($1,7)
  169.   set -l %n2 $bignum_toknum($2,7)
  170.   set -l %l1 $numtok(%n1,95)
  171.   set -l %l2 $numtok(%n2,95)
  172.   set -l %x 1
  173.   set -l %r 0
  174.   set -l %a $gettok(%n2,1,95)
  175.   set -l %y 1
  176.   set -l %p 0
  177.   set -l %s
  178.   set -l %c
  179.   :l
  180.   %c = $calc((%a * $gettok(%n1,%y,95)) + %p)
  181.   %p = 0
  182.   if ($left(%c,-7)) {
  183.     %p = $v1
  184.     %c = $right(%c,7)
  185.   }
  186.   %s = $+($base(%c,10,10,7),%s)
  187.   inc %y
  188.   if (%y <= %l1) goto l
  189.   if (%p) %s = $+(%p,%s)
  190.   %r = $_add(%r,$+(%s,$str(0,$calc((%x - 1) * 7))))
  191.   inc %x
  192.   %a = $gettok(%n2,%x,95)
  193.   %y = 1
  194.   %p = 0
  195.   %s = $null
  196.   if (%x <= %l2) goto l
  197.   return %r
  198. }
  199.  
  200. alias bignum_mul {
  201.   if (!$regex($1,/^[+-]?\d+(\.\d+)?$/)) || (!$regex($2,/^[+-]?\d+(\.\d+)?$/)) return erro
  202.   set -l %n1 $regsubex(sign1,$1,/^([+-])/,)
  203.   set -l %n2 $regsubex(sign2,$2,/^([+-])/,)
  204.   if (($regml(sign1,1) == -) && (($regml(sign2,1) == +) || (!$v1))) || (($regml(sign2,1) == -) && (($regml(sign1,1) == +) || (!$v1))) set -l %sign -
  205.   tokenize 46 %n1
  206.   set -l %i1 $regsubex($1,/^0+/,)
  207.   set -l %f1 $regsubex($2,/0+$/,)
  208.   tokenize 46 %n2
  209.   set -l %i2 $regsubex($1,/^0+/,)
  210.   set -l %f2 $regsubex($2,/0+$/,)
  211.   set -l %f $calc($len(%f1) + $len(%f2))
  212.   %n1 = $+(%i1,%f1)
  213.   %n2 = $+(%i2,%f2)
  214.   if (!%n1) || (!%n2) return 0
  215.   if ($len(%n2) > $len(%n1)) return $bignum_float($_mul(%n2,%n1),%f,%sign)
  216.   return $bignum_float($_mul(%n1,%n2),%f,%sign)
  217. }
  218.  
  219. alias bignum_add {
  220.   if (!$regex($1,/^[+-]?\d+(\.\d+)?$/)) || (!$regex($2,/^[+-]?\d+(\.\d+)?$/)) return erro
  221.   set -l %n1 $regsubex(sign1,$1,/^([+-])/,)
  222.   set -l %n2 $regsubex(sign2,$2,/^([+-])/,)
  223.   if (($regml(sign1,1) == -) && (($regml(sign2,1) == +) || (!$v1))) || (($regml(sign2,1) == -) && (($regml(sign1,1) == +) || (!$v1))) return $bignum_sub($1,$2)
  224.   if ($regml(sign1,1) == -) set -l %s -
  225.   tokenize 46 %n1
  226.   set -l %i1 $regsubex($1,/^0+/,)
  227.   set -l %f1 $regsubex($2,/0+$/,)
  228.   tokenize 46 %n2
  229.   set -l %i2 $regsubex($1,/^0+/,)
  230.   set -l %f2 $regsubex($2,/0+$/,)
  231.   set -l %f $len(%f1)
  232.   if ((%f1) || (%f2)) && ($len(%f1) != $len(%f2)) {
  233.     set -l %fl1 $v1
  234.     set -l %fl2 $v2
  235.     if (%fl1 > %fl2) %f2 = $+(%f2,$str(0,$calc(%fl1 - %fl2)))
  236.     else %f1 = $+(%f1,$str(0,$calc(%fl2 - %fl1)))
  237.     %f = $len(%f1)
  238.   }
  239.   %n1 = $+(%i1,%f1)
  240.   %n2 = $+(%i2,%f2)
  241.   if (!%n1) && (!%n2) return 0
  242.   if (!%n1) return $bignum_float(%n2,%f,%s)
  243.   if (!%n2) return $bignum_float(%n1,%f,%s)
  244.   return $bignum_float($_add(%n1,%n2),%f,%s)
  245. }
  246.  
  247. alias bignum_float {
  248.   if ($2 == 0) return $+($3,$1)
  249.   set -l %i $left($1,$+(-,$2))
  250.   set -l %f $regsubex($bignum_lpad0($right($1,$2),$2),/0+$/,)
  251.   if (!%i) %i = 0
  252.   if (%f) return $+($3,%i,.,%f)
  253.   return $+($3,%i)
  254. }
  255.  
  256. alias bignum_lpad0 {
  257.   if ($len($1) < $2) return $+($str(0,$calc($2 - $v1)),$1)
  258.   return $1
  259. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement