1 | bigInt = require('big-integer')
|
2 |
|
3 |
|
4 | version = "1.1.2"
|
5 |
|
6 | SELFTEST = 1
|
7 |
|
8 |
|
9 | NSYM = 1000
|
10 |
|
11 | DEBUG = false
|
12 | PRINTOUTRESULT = false
|
13 |
|
14 |
|
15 | PRINTMODE_LATEX = "PRINTMODE_LATEX"
|
16 | PRINTMODE_2DASCII = "PRINTMODE_2DASCII"
|
17 | PRINTMODE_FULL = "PRINTMODE_FULL"
|
18 | PRINTMODE_PLAIN = "PRINTMODE_PLAIN"
|
19 | PRINTMODE_LIST = "PRINTMODE_LIST"
|
20 |
|
21 |
|
22 |
|
23 | environment_printmode = PRINTMODE_PLAIN
|
24 | printMode = PRINTMODE_PLAIN
|
25 |
|
26 | dontCreateNewRadicalsInDenominatorWhenEvalingMultiplication = true
|
27 | recursionLevelNestedRadicalsRemoval = 0
|
28 | do_simplify_nested_radicals = true
|
29 | avoidCalculatingPowersIntoArctans = true
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 | class rational
|
53 | a: null
|
54 | b: null
|
55 |
|
56 | class U
|
57 | cons: null
|
58 | printname: ""
|
59 | str: ""
|
60 | tensor: null
|
61 |
|
62 | q: null
|
63 | d: 0.0
|
64 | k: 0
|
65 | tag: 0
|
66 |
|
67 | toString: -> print_expr(this)
|
68 | toLatexString: -> collectLatexStringFromReturnValue(this)
|
69 |
|
70 | constructor: ->
|
71 | @cons = {}
|
72 | @cons.car = null
|
73 | @cons.cdr = null
|
74 | @q = new rational()
|
75 |
|
76 |
|
77 | errorMessage = ""
|
78 |
|
79 |
|
80 |
|
81 |
|
82 | CONS = 0
|
83 | NUM = 1
|
84 | DOUBLE = 2
|
85 | STR = 3
|
86 | TENSOR = 4
|
87 | SYM = 5
|
88 |
|
89 |
|
90 |
|
91 |
|
92 |
|
93 | counter = 0
|
94 | ABS = counter++
|
95 | ADD = counter++
|
96 | ADJ = counter++
|
97 | AND = counter++
|
98 | APPROXRATIO = counter++
|
99 | ARCCOS = counter++
|
100 | ARCCOSH = counter++
|
101 | ARCSIN = counter++
|
102 | ARCSINH = counter++
|
103 | ARCTAN = counter++
|
104 | ARCTANH = counter++
|
105 | ARG = counter++
|
106 | ATOMIZE = counter++
|
107 | BESSELJ = counter++
|
108 | BESSELY = counter++
|
109 | BINDING = counter++
|
110 | BINOMIAL = counter++
|
111 | CEILING = counter++
|
112 | CHECK = counter++
|
113 | CHOOSE = counter++
|
114 | CIRCEXP = counter++
|
115 | CLEAR = counter++
|
116 | CLEARALL = counter++
|
117 | CLEARPATTERNS = counter++
|
118 | CLOCK = counter++
|
119 | COEFF = counter++
|
120 | COFACTOR = counter++
|
121 | CONDENSE = counter++
|
122 | CONJ = counter++
|
123 | CONTRACT = counter++
|
124 | COS = counter++
|
125 | COSH = counter++
|
126 | DECOMP = counter++
|
127 | DEFINT = counter++
|
128 | DEGREE = counter++
|
129 | DENOMINATOR = counter++
|
130 | DERIVATIVE = counter++
|
131 | DET = counter++
|
132 | DIM = counter++
|
133 | DIRAC = counter++
|
134 | DIVISORS = counter++
|
135 | DO = counter++
|
136 | DOT = counter++
|
137 | DRAW = counter++
|
138 | DSOLVE = counter++
|
139 | EIGEN = counter++
|
140 | EIGENVAL = counter++
|
141 | EIGENVEC = counter++
|
142 | ERF = counter++
|
143 | ERFC = counter++
|
144 | EVAL = counter++
|
145 | EXP = counter++
|
146 | EXPAND = counter++
|
147 | EXPCOS = counter++
|
148 | EXPSIN = counter++
|
149 | FACTOR = counter++
|
150 | FACTORIAL = counter++
|
151 | FACTORPOLY = counter++
|
152 | FILTER = counter++
|
153 | FLOATF = counter++
|
154 | FLOOR = counter++
|
155 | FOR = counter++
|
156 | FUNCTION = counter++
|
157 | GAMMA = counter++
|
158 | GCD = counter++
|
159 | HERMITE = counter++
|
160 | HILBERT = counter++
|
161 | IMAG = counter++
|
162 | INDEX = counter++
|
163 | INNER = counter++
|
164 | INTEGRAL = counter++
|
165 | INV = counter++
|
166 | INVG = counter++
|
167 | ISINTEGER = counter++
|
168 | ISPRIME = counter++
|
169 | LAGUERRE = counter++
|
170 |
|
171 | LCM = counter++
|
172 | LEADING = counter++
|
173 | LEGENDRE = counter++
|
174 | LOG = counter++
|
175 | LOOKUP = counter++
|
176 | MOD = counter++
|
177 | MULTIPLY = counter++
|
178 | NOT = counter++
|
179 | NROOTS = counter++
|
180 | NUMBER = counter++
|
181 | NUMERATOR = counter++
|
182 | OPERATOR = counter++
|
183 | OR = counter++
|
184 | OUTER = counter++
|
185 | PATTERN = counter++
|
186 | PATTERNSINFO = counter++
|
187 | POLAR = counter++
|
188 | POWER = counter++
|
189 | PRIME = counter++
|
190 | PRINT_LEAVE_E_ALONE = counter++
|
191 | PRINT_LEAVE_X_ALONE = counter++
|
192 | PRINT = counter++
|
193 | PRINT2DASCII = counter++
|
194 | PRINTFULL = counter++
|
195 | PRINTLATEX = counter++
|
196 | PRINTLIST = counter++
|
197 | PRINTPLAIN = counter++
|
198 | PRODUCT = counter++
|
199 | QUOTE = counter++
|
200 | QUOTIENT = counter++
|
201 | RANK = counter++
|
202 | RATIONALIZE = counter++
|
203 | REAL = counter++
|
204 | ROUND = counter++
|
205 | YYRECT = counter++
|
206 | ROOTS = counter++
|
207 | SETQ = counter++
|
208 | SGN = counter++
|
209 | SILENTPATTERN = counter++
|
210 | SIMPLIFY = counter++
|
211 | SIN = counter++
|
212 | SINH = counter++
|
213 | SHAPE = counter++
|
214 | SQRT = counter++
|
215 | STOP = counter++
|
216 | SUBST = counter++
|
217 | SUM = counter++
|
218 | SYMBOLSINFO = counter++
|
219 | TAN = counter++
|
220 | TANH = counter++
|
221 | TAYLOR = counter++
|
222 | TEST = counter++
|
223 | TESTEQ = counter++
|
224 | TESTGE = counter++
|
225 | TESTGT = counter++
|
226 | TESTLE = counter++
|
227 | TESTLT = counter++
|
228 | TRANSPOSE = counter++
|
229 | UNIT = counter++
|
230 | ZERO = counter++
|
231 |
|
232 |
|
233 |
|
234 | NIL = counter++
|
235 | LAST = counter++
|
236 |
|
237 | LAST_PRINT = counter++
|
238 | LAST_2DASCII_PRINT = counter++
|
239 | LAST_FULL_PRINT = counter++
|
240 | LAST_LATEX_PRINT = counter++
|
241 | LAST_LIST_PRINT = counter++
|
242 | LAST_PLAIN_PRINT = counter++
|
243 |
|
244 | AUTOEXPAND = counter++
|
245 | BAKE = counter++
|
246 | ASSUME_REAL_VARIABLES = counter++
|
247 | TRACE = counter++
|
248 |
|
249 | YYE = counter++
|
250 |
|
251 | DRAWX = counter++
|
252 | METAA = counter++
|
253 | METAB = counter++
|
254 | METAX = counter++
|
255 | SECRETX = counter++
|
256 |
|
257 | VERSION = counter++
|
258 |
|
259 | PI = counter++
|
260 | SYMBOL_A = counter++
|
261 | SYMBOL_B = counter++
|
262 | SYMBOL_C = counter++
|
263 | SYMBOL_D = counter++
|
264 | SYMBOL_I = counter++
|
265 | SYMBOL_J = counter++
|
266 | SYMBOL_N = counter++
|
267 | SYMBOL_R = counter++
|
268 | SYMBOL_S = counter++
|
269 | SYMBOL_T = counter++
|
270 | SYMBOL_X = counter++
|
271 | SYMBOL_Y = counter++
|
272 | SYMBOL_Z = counter++
|
273 | SYMBOL_IDENTITY_MATRIX = counter++
|
274 |
|
275 | SYMBOL_A_UNDERSCORE = counter++
|
276 | SYMBOL_B_UNDERSCORE = counter++
|
277 | SYMBOL_X_UNDERSCORE = counter++
|
278 |
|
279 | C1 = counter++
|
280 | C2 = counter++
|
281 | C3 = counter++
|
282 | C4 = counter++
|
283 | C5 = counter++
|
284 | C6 = counter++
|
285 |
|
286 | USR_SYMBOLS = counter++
|
287 |
|
288 | E = YYE
|
289 |
|
290 |
|
291 |
|
292 |
|
293 |
|
294 | TOS = 100000
|
295 |
|
296 | BUF = 10000
|
297 |
|
298 | MAX_PROGRAM_SIZE = 100001
|
299 | MAXPRIMETAB = 10000
|
300 | MAX_CONSECUTIVE_APPLICATIONS_OF_ALL_RULES = 5
|
301 | MAX_CONSECUTIVE_APPLICATIONS_OF_SINGLE_RULE = 10
|
302 | ENABLE_CACHING = true
|
303 | cached_runs = null
|
304 | cached_findDependenciesInScript = null
|
305 |
|
306 |
|
307 |
|
308 | MAXDIM = 24
|
309 |
|
310 |
|
311 |
|
312 |
|
313 | symbolsDependencies = {}
|
314 | symbolsHavingReassignments = []
|
315 | symbolsInExpressionsWithoutAssignments = []
|
316 | patternHasBeenFound = false
|
317 |
|
318 | predefinedSymbolsInGlobalScope_doNotTrackInDependencies = [
|
319 | "rationalize"
|
320 | "abs"
|
321 | "e"
|
322 | "i"
|
323 | "pi"
|
324 | "sin"
|
325 | "ceiling"
|
326 | "cos"
|
327 | "roots"
|
328 | "integral"
|
329 | "derivative"
|
330 | "defint"
|
331 | "sqrt"
|
332 | "eig"
|
333 | "cov"
|
334 | "deig"
|
335 | "dcov"
|
336 | "float"
|
337 | "floor"
|
338 | "product"
|
339 | "root"
|
340 | "round"
|
341 | "sum"
|
342 | "test"
|
343 | "unit"
|
344 | ]
|
345 |
|
346 |
|
347 |
|
348 |
|
349 |
|
350 |
|
351 | parse_time_simplifications = true
|
352 |
|
353 | chainOfUserSymbolsNotFunctionsBeingEvaluated = []
|
354 |
|
355 | stringsEmittedByUserPrintouts = ""
|
356 |
|
357 |
|
358 |
|
359 |
|
360 | called_from_Algebra_block = false
|
361 |
|
362 |
|
363 | class tensor
|
364 | ndim: 0
|
365 | dim: null
|
366 | nelem: 0
|
367 | elem: null
|
368 |
|
369 | constructor: ->
|
370 | @dim = (0 for [0..MAXDIM])
|
371 | @elem = []
|
372 |
|
373 |
|
374 | class display
|
375 | h: 0
|
376 | w: 0
|
377 | n: 0
|
378 | a: []
|
379 |
|
380 |
|
381 | class text_metric
|
382 | ascent: 0
|
383 | descent: 0
|
384 | width: 0
|
385 |
|
386 |
|
387 | tos = 0
|
388 | expanding = 0
|
389 | evaluatingAsFloats = 0
|
390 | evaluatingPolar = 0
|
391 | fmt_x = 0
|
392 | fmt_index = 0
|
393 | fmt_level = 0
|
394 | verbosing = 0
|
395 |
|
396 |
|
397 |
|
398 | primetab = do ->
|
399 | primes = [2]
|
400 | i = 3
|
401 | while primes.length < MAXPRIMETAB
|
402 | j = 0
|
403 | ceil = Math.sqrt(i)
|
404 | while j < primes.length and primes[j] <= ceil
|
405 | if i % primes[j] == 0
|
406 | j = -1
|
407 | break
|
408 | j++
|
409 | if j != -1
|
410 | primes.push(i)
|
411 | i += 2
|
412 | primes[MAXPRIMETAB] = 0
|
413 | return primes
|
414 |
|
415 |
|
416 |
|
417 | esc_flag = 0
|
418 | draw_flag = 0
|
419 | mtotal = 0
|
420 | trigmode = 0
|
421 | logbuf = ""
|
422 | program_buf = ""
|
423 |
|
424 |
|
425 | symtab = []
|
426 |
|
427 |
|
428 | binding = []
|
429 | isSymbolReclaimable = []
|
430 |
|
431 | arglist = []
|
432 | stack = []
|
433 | frame = 0
|
434 | p0 = null
|
435 | p1 = null
|
436 | p2 = null
|
437 | p3 = null
|
438 | p4 = null
|
439 | p5 = null
|
440 | p6 = null
|
441 | p7 = null
|
442 | p8 = null
|
443 | p9 = null
|
444 |
|
445 | zero = null
|
446 | one = null
|
447 | one_as_double = null
|
448 | imaginaryunit = null
|
449 |
|
450 | out_buf = ""
|
451 | out_count = 0
|
452 | test_flag = 0
|
453 | codeGen = false
|
454 | draw_stop_return = null
|
455 | userSimplificationsInListForm = []
|
456 | userSimplificationsInStringForm = []
|
457 |
|
458 | transpose_unicode = 7488
|
459 | dotprod_unicode = 183
|
460 |
|
461 | symbol = (x) -> (symtab[x])
|
462 | iscons = (p) -> (p.k == CONS)
|
463 | isrational = (p) -> (p.k == NUM)
|
464 | isdouble = (p) -> (p.k == DOUBLE)
|
465 | isnum = (p) -> (isrational(p) || isdouble(p))
|
466 | isstr = (p) -> (p.k == STR)
|
467 | istensor = (p) -> (if !p? then debugger else p.k == TENSOR)
|
468 |
|
469 |
|
470 |
|
471 | isnumerictensor = (p) ->
|
472 | if isnum(p) or p == symbol(SYMBOL_IDENTITY_MATRIX)
|
473 | return 1
|
474 |
|
475 | if !istensor(p) and !isnum(p)
|
476 |
|
477 | return 0
|
478 |
|
479 | n = p.tensor.nelem
|
480 | a = p.tensor.elem
|
481 |
|
482 | for i in [0...n]
|
483 | if !isnumerictensor(a[i])
|
484 |
|
485 | return 0
|
486 | return 1
|
487 |
|
488 | issymbol = (p) -> (p.k == SYM)
|
489 | iskeyword = (p) -> (issymbol(p) && symnum(p) < NIL)
|
490 |
|
491 | car = (p) -> if iscons(p) then p.cons.car else symbol(NIL)
|
492 | cdr = (p) -> if iscons(p) then p.cons.cdr else symbol(NIL)
|
493 | caar = (p) -> car(car(p))
|
494 | cadr = (p) -> car(cdr(p))
|
495 | cdar = (p) -> cdr(car(p))
|
496 | cddr = (p) -> cdr(cdr(p))
|
497 | caadr = (p) -> car(car(cdr(p)))
|
498 | caddr = (p) -> car(cdr(cdr(p)))
|
499 | cadar = (p) -> car(cdr(car(p)))
|
500 | cdadr = (p) -> cdr(car(cdr(p)))
|
501 | cddar = (p) -> cdr(cdr(car(p)))
|
502 | cdddr = (p) -> cdr(cdr(cdr(p)))
|
503 | caaddr = (p) -> car(car(cdr(cdr(p))))
|
504 | cadadr = (p) -> car(cdr(car(cdr(p))))
|
505 | caddar = (p) -> car(cdr(cdr(car(p))))
|
506 | cdaddr = (p) -> cdr(car(cdr(cdr(p))))
|
507 | cadddr = (p) -> car(cdr(cdr(cdr(p))))
|
508 | cddddr = (p) -> cdr(cdr(cdr(cdr(p))))
|
509 | caddddr = (p) -> car(cdr(cdr(cdr(cdr(p)))))
|
510 | cadaddr = (p) -> car(cdr(car(cdr(cdr(p)))))
|
511 | cddaddr = (p) -> cdr(cdr(car(cdr(cdr(p)))))
|
512 | caddadr = (p) -> car(cdr(cdr(car(cdr(p)))))
|
513 | cdddaddr = (p) -> cdr(cdr(cdr(car(cdr(cdr(p))))))
|
514 | caddaddr = (p) -> car(cdr(cdr(car(cdr(cdr(p))))))
|
515 |
|
516 |
|
517 | listLength = (p) ->
|
518 | startCount = -1
|
519 |
|
520 | while iscons(p)
|
521 | p = cdr(p)
|
522 | startCount++
|
523 |
|
524 | return startCount
|
525 |
|
526 |
|
527 | nthCadr = (p,n) ->
|
528 | startCount = 0
|
529 |
|
530 | while startCount <= n
|
531 | p = cdr(p)
|
532 | startCount++
|
533 |
|
534 | return car(p)
|
535 |
|
536 | isadd = (p) -> (car(p) == symbol(ADD))
|
537 | ismultiply = (p) -> (car(p) == symbol(MULTIPLY))
|
538 | ispower = (p) -> (car(p) == symbol(POWER))
|
539 | isfactorial = (p) -> (car(p) == symbol(FACTORIAL))
|
540 | isinnerordot = (p) -> ((car(p) == symbol(INNER)) or (car(p) == symbol(DOT)))
|
541 | istranspose = (p) -> (car(p) == symbol(TRANSPOSE))
|
542 | isinv = (p) -> (car(p) == symbol(INV))
|
543 |
|
544 |
|
545 |
|
546 | isidentitymatrix = (p) -> (p == symbol(SYMBOL_IDENTITY_MATRIX))
|
547 |
|
548 | MSIGN = (p) ->
|
549 | if p.isPositive()
|
550 | return 1
|
551 | else if p.isZero()
|
552 | return 0
|
553 | else
|
554 | return -1
|
555 |
|
556 | MLENGTH = (p) -> p.toString().length
|
557 |
|
558 | MZERO = (p) -> p.isZero()
|
559 | MEQUAL = (p, n) ->
|
560 | if !p?
|
561 | debugger
|
562 | p.equals(n)
|
563 |
|
564 |
|
565 | reset_after_error = ->
|
566 | moveTos 0
|
567 | esc_flag = 0
|
568 | draw_flag = 0
|
569 | frame = TOS
|
570 | evaluatingAsFloats = 0
|
571 | evaluatingPolar = 0
|
572 |
|
573 |
|
574 | $ = (exports ? this)
|
575 |
|
576 | $.version = version
|
577 |
|
578 | $.isadd = isadd
|
579 | $.ismultiply = ismultiply
|
580 | $.ispower = ispower
|
581 | $.isfactorial = isfactorial
|
582 |
|
583 |
|
584 |
|
585 | $.car = car
|
586 | $.cdr = cdr
|
587 | $.caar = caar
|
588 | $.cadr = cadr
|
589 | $.cdar = cdar
|
590 | $.cddr = cddr
|
591 | $.caadr = caadr
|
592 | $.caddr = caddr
|
593 | $.cadar = cadar
|
594 | $.cdadr = cdadr
|
595 | $.cddar = cddar
|
596 | $.cdddr = cdddr
|
597 | $.caaddr = caaddr
|
598 | $.cadadr = cadadr
|
599 | $.caddar = caddar
|
600 | $.cdaddr = cdaddr
|
601 | $.cadddr = cadddr
|
602 | $.cddddr = cddddr
|
603 | $.caddddr = caddddr
|
604 | $.cadaddr = cadaddr
|
605 | $.cddaddr = cddaddr
|
606 | $.caddadr = caddadr
|
607 | $.cdddaddr = cdddaddr
|
608 | $.caddaddr = caddaddr
|
609 |
|
610 |
|
611 |
|
612 | $.symbol = symbol
|
613 | $.iscons = iscons
|
614 | $.isrational = isrational
|
615 | $.isdouble = isdouble
|
616 | $.isnum = isnum
|
617 | $.isstr = isstr
|
618 | $.istensor = istensor
|
619 | $.issymbol = issymbol
|
620 | $.iskeyword = iskeyword
|
621 |
|
622 |
|
623 |
|
624 |
|
625 | $.CONS = CONS
|
626 | $.NUM = NUM
|
627 | $.DOUBLE = DOUBLE
|
628 | $.STR = STR
|
629 | $.TENSOR = TENSOR
|
630 | $.SYM = SYM
|