All pastes #552483 Raw Edit

Mine

public text v1 · immutable
·published 2007-06-09 09:31 UTC
rendered paste body
alias factorise { 
  unset %factr.* 
  var %factr.input = $1- 
  if ($+(*,$chr(94),*) iswm $1-) { 
    var %factr.orgstring = $replace($1-,$chr(178),^2,$chr(179),^3,pi,$pi) 
    var %factr.string $replace(%factr.orgstring,$chr(41),CBKT,$chr(40),OBKT) 
    noop $regex(%factr.string,/([[:alpha:]])((CBKT)+)?(\^)/g) 
    var %factr.char = $regml(1) 
    set %factr.repl %factr.string 
    var %i = 1 

    ; CHECK IF IT NEEDS TO PERFORM ANY SIN/TAN/COS/SQRT STUFF 
    while (*sin* iswm %factr.repl || *tan* iswm %factr.repl || *cos* iswm %factr.repl || *sq* iswm %factr.repl) { 
      set %factr.repl $regsubex(%factr.repl,/(?:asin(e)?)(?:OBKT)?([\.0-9]+)(?:CBKT)?/g,$asin(\t).deg) 
      set %factr.repl $regsubex(%factr.repl,/(?:atan(gent)?)(?:OBKT)?([\.0-9]+)(?:CBKT)?/g,$atan(\t).deg) 
      set %factr.repl $regsubex(%factr.repl,/(?:acos(ine)?)(?:OBKT)?([\.0-9]+)(?:CBKT)?/g,$acos(\t).deg) 
      set %factr.repl $regsubex(%factr.repl,/(?:sin(e)?)(?:OBKT)?([\.0-9]+)(?:CBKT)?/g,$sin(\t).deg) 
      set %factr.repl $regsubex(%factr.repl,/(?:tan(gent)?)(?:OBKT)?([\.0-9]+)(?:CBKT)?/g,$tan(\t).deg) 
      set %factr.repl $regsubex(%factr.repl,/(?:cos(ine)?)(?:OBKT)?([\.0-9]+)(?:CBKT)?/g,$cos(\t).deg) 
      set %factr.repl $regsubex(%factr.repl,/(?:sq(?:r)?(?:t|oot)|square(?:rt|root))(?:OBKT)?([\.0-9]+)(?:CBKT)?/g,$sqrt(\t)) 
      inc %i 
    } 
    set %factr.finrepl $replace(%factr.repl,OBKT,$chr(40),CBKT,$chr(41),$+($chr(43),$chr(45)),$chr(45),$+($chr(45),$chr(43)),$chr(43),$+($chr(43),$chr(43)),$chr(43),$+($chr(45),$chr(45)),$chr(43)) 

    ; ALL IN RIGHT SYNTAX 
    set %factr.rearr %factr.finrepl 
    set %factr.chtimes $calc($numtok($replace(%factr.finrepl,$chr(45),$chr(43)),43)) 
    var %e = 1 
    while (%e <= %factr.chtimes) { 
      set %factr.rearr $regsubex(%factr.rearr,/(\+|\-|^|\=) $+ %factr.char $+ (\+|\-|\=|$)/g,\1 $+ 1 $+ %factr.char $+ ^1\2) 
      set %factr.rearr $regsubex(%factr.rearr,/(\+|\-|^|\=)([\.0-9]+) $+ %factr.char $+ (\+|\-|\=|$)/g,\1 $+ \2 $+ %factr.char $+ ^1\3) 
      set %factr.rearr $regsubex(%factr.rearr,/(\+|\-|^|\=) $+ %factr.char $+ \^([\.0-9]+)(\+|\-|\=|$)/g,\1 $+ 1 $+ %factr.char $+ ^\2\3) 
      set %factr.rearr $regsubex(%factr.rearr,/(\+|\-|^|\=)([\.0-9]+)(\+|\-|\=|$)/g,\1\2 $+ %factr.char $+ ^0\3) 
      inc %e 
    } 
    $iif($left(%factr.rearr,1) != $chr(43) && $left(%factr.rearr,1) != $chr(45),set %factr.rearr $+($chr(43),%factr.rearr)) 

    ; CHUCK STUFF ON RIGHT OF = TO LEFT 

    if ($+(*,$chr(61),*) iswm %factr.rearr) { 
      tokenize 61 %factr.rearr 
      set %factr.aftreq $iif($left($2,1) != $chr(43) && $left($2,1) != $chr(45),$+($chr(43),$2),$2) 
      var %factr.rearr = $1 $+ $replace(%factr.aftreq,$chr(43),$chr(167),$chr(45),$chr(43),$chr(167),$chr(45)) 

    } 

    ; WORK OUT NUMBER OF COEFFS 

    set %factr.degs $gettok($sorttok($regsubex(%factr.rearr,/(\+|\-)([\.0-9]+) $+ %factr.char $+ \^/g,$chr(126)),126,nr),1,126) 


    ; COLLECT TERMS 
    var %q = 0 
    while (%q <= %factr.degs) { 
      %factr.addterms = $regex(%factr.rearr,/(\+|\-)([\.0-9]+) $+ %factr.char $+ \^ $+ %q $+ /g) 
      var %r = 1 
      $iif(!$calc(!%factr.addterms), set %factr. [ $+ [ %q ] ] 0) 
      while (%r <= $calc(%factr.addterms * 2 - 1)) { 
        set %factr. [ $+ [ %q ] ] $calc(%factr. [ $+ [ %q ] ] $regml(%r) $regml($calc(%r + 1))) 
        inc %r 2 
      } 
      inc %q 
    } 

    ; DIVIDE ONE BY THE OTHER AND LOOP 
    set %factr.origdegs %factr.degs 
    var %z = 0 
    set %factr.repall 1 
    while (%z < %factr.origdegs && %factr.repall == 1) { 
      if (%factr.repeat == 1) { 
        set %factr.t [ $+ [ $calc(%factr.degs - 1) ] ] %factr. [ $+ [ %factr.degs ] ] 
        var %y = 0 
        while (%y < $calc(%factr.degs - 1)) { 
          set %factr.t [ $+ [ $calc(%factr.degs - 2 - %y) ] ] $calc(%factr. [ $+ [ $calc(%factr.degs - 1 - %y) ] ] + %factr.t [ $+ [ $calc(%factr.degs - 1 - %y) ] ] * %factr.root) 
          inc %y 
        } 
        unset %factr. [ $+ [ %factr.degs ] ] 
        dec %factr.degs 

        ; GIVE BACK ORIG NAMES 
        var %y = 0 
        while (%y <= %factr.degs) { 
          set %factr. [ $+ [ %y ] ] %factr.t [ $+ [ %y ] ] 
          inc %y 
        } 
      } 

      ; CREATE EQUATION 
      unset %factr.fineq 
      unset %factr.nextloop 
      var %q = %factr.degs 
      while ($calc(%q + 1) > 0) { 
        set %factr.fineq %factr.fineq $+ $iif($left(%factr. [ $+ [ %q ] ],1) != $chr(45),$chr(43)) $+ %factr. [ $+ [ %q ] ] $+ %factr.char $+ ^ $+ %q $+ $chr(41) 
        set %factr.nextloop $iif(%factr. [ $+ [ %q ] ] != 0,$+($iif(%q == %factr.degs,$chr(40)),%factr.nextloop,$iif($left(%factr. [ $+ [ %q ] ],1) != $chr(45),$chr(43)),%factr. [ $+ [ %q ] ],%factr.char,^,%q,$iif(%q == 0,$chr(41))),%factr.nextloop) 
        set %factr.nextloop $replace($remove(%factr.nextloop,$+(%factr.char,^,0)),$+(1,%factr.char),%factr.char,$+($chr(40),+),$chr(40)) 
        dec %q 
      } 

      ; CHANGE %factr.0 TO POSITIVE 
      $iif($left(%factr.0,1) == $chr(45),set %factr.0 $right(%factr.0,-1)) 

      ; LIST ALL NUMERATORS 
      unset %factr.numtors 
      var %n = 1 
      while (%n <= $calc(%factr.0 / 2)) { 
        if (%n // %factr.0) { 
          set %factr.numtors %factr.numtors $+ $chr(44) $+ %n 
        } 
        inc %n 
      } 
      set %factr.numtors %factr.numtors $+ $chr(44) $+ %factr.0 

      ; LIST ALL DENOMINATORS 
      unset %factr.denumtors 
      var %n = 1 
      while (%n <= $calc(%factr. [ $+ [ %factr.degs ] ] / 2)) { 
        if (%n // %factr. [ $+ [ %factr.degs ] ]) { 
          set %factr.denumtors %factr.denumtors $+ $chr(44) $+ %n 
        } 
        inc %n 
      } 
      set %factr.denumtors %factr.denumtors $+ $chr(44) $+ %factr. [ $+ [ %factr.degs ] ] 

      ; LOOP THROUGH POSS SOLUTIONS UNTIL FACTOR 
      set %factr.sign $chr(43) 
      set %factr.attmpt 
      var %r = 1 
      set %factr.repall 2 
      while (%r <= $numtok(%factr.denumtors,44)) { 
        tokenize 44 %factr.denumtors 
        set %factr.denumatt $ [ $+ [ %r ] ] 
        var %n = 1 
        while (%n <= $numtok(%factr.numtors,44 && %factr.attmpt != 0)) { 
          tokenize 44 %factr.numtors 
          set %factr.numatt $ [ $+ [ %n ] ] 
          inc %n 
          var %q = 0 
          while (%q < 1 && %factr.attmpt != 0) { 
            set %factr.attmpt $calc($replace(%factr.fineq,%factr.char,$+(*,$chr(40),%factr.sign,$chr(40),$+($chr(40),%factr.numatt,$chr(47),%factr.denumatt,$chr(41),$chr(41))))) 

            ; ON CORRECT FACTOR 
            if (%factr.attmpt == 0 && %factr.denumatt != 0 && %factr.numatt != 0) { 
              set %factr.fctised $+(%factr.fctised,$chr(40),%factr.char,$replace(%factr.sign,$chr(43),$chr(167),$chr(45),$chr(43),$chr(167),$chr(45)),%factr.numatt,$chr(47),%factr.denumatt,$chr(41)) 
              set %factr.root $+(%factr.sign,%factr.numatt,$chr(47),%factr.denumatt) 
              set %factr.repeat 1 
              set %factr.repall 1 
            } 
            if (%factr.sign == $chr(45)) { 
              set %factr.sign $chr(43) 
              inc %q 
            } 
            else { 
              set %factr.sign $chr(45) 
            } 
          } 
        } 
        inc %r 
      } 
      inc %z 
    } 

    ; CHANGE FORMAT OF OUTPUT 
    $iif(*/1* iswm %factr.fctised || *^1* iswm %factr.fctised, set %factr.fctised $remove(%factr.fctised,/1,^1)) 
    set %factr.fctised $regsubex(%factr.fctised,/ $+ %factr.char $+ (\+|\-)([\.0-9]+)(\/)(\-)?([\.0-9]+)/g,\4 $+ %factr.char $+ \1\2) 
    if ($count(%factr.fctised,$chr(40)) => 1 && $count(%factr.fctised,$chr(40)) < %factr.origdegs) { 
      set %factr.fctised $+(%factr.fctised,%factr.nextloop) 
    } 
    if (!%factr.fctised) { 
      set %factr.fctised $remove(%factr.fineq,$+(%factr.char,^0),^1,$chr(41)) 
      set %factr.fctised $iif($left(%factr.fctised,1) == $chr(43),$right(%factr.fctised,-1),%factr.fctised) 
    } 
    return %factr.fctised 
  } 
}