@@ -60,13 +60,10 @@ pub fn divide(
60
60
ram,
61
61
divide,
62
62
) ,
63
- None => Parameters :: Div (
64
- Box :: from ( Parameters :: Var ( Box :: from ( Parameters :: Int ( 1 ) ) , 1 , s. clone ( ) ) ) ,
65
- Box :: from ( Parameters :: Var (
66
- Box :: from ( Parameters :: Int ( 1 ) ) ,
67
- 1 ,
68
- s2. clone ( ) ,
69
- ) ) ,
63
+ None => divide (
64
+ Parameters :: Var ( Box :: from ( Parameters :: Int ( 1 ) ) , 1 , s. clone ( ) ) ,
65
+ Parameters :: Var ( Box :: from ( Parameters :: Int ( 1 ) ) , 1 , s2. clone ( ) ) ,
66
+ ram,
70
67
) ,
71
68
} ,
72
69
@@ -181,6 +178,7 @@ pub fn divide(
181
178
) ;
182
179
first
183
180
}
181
+ //(x+y)/a = x/a + y/a
184
182
( Parameters :: Plus ( s1, s2) , Parameters :: Identifier ( s3) ) => {
185
183
let first = add (
186
184
divide (
@@ -197,6 +195,7 @@ pub fn divide(
197
195
) ;
198
196
first
199
197
}
198
+
200
199
( Parameters :: Identifier ( s3) , Parameters :: Plus ( s1, s2) ) => {
201
200
let first = Parameters :: Div (
202
201
Box :: from ( Parameters :: Var ( Box :: new ( Parameters :: Int ( 1 ) ) , 1 , s3. clone ( ) ) ) ,
@@ -268,7 +267,6 @@ pub fn divide(
268
267
269
268
( Parameters :: Plus ( s1, s2) , Parameters :: Null ) => add ( * s1. clone ( ) , * s2. clone ( ) , ram) ,
270
269
271
- //x/yz = x/y * 1/z | 1/y * x/z
272
270
( Parameters :: Var ( x, y, z) , Parameters :: Mul ( s1, s2) ) => {
273
271
let first = mult (
274
272
divide ( Parameters :: Var ( x. clone ( ) , y, z. clone ( ) ) , * s1. clone ( ) , ram) ,
@@ -290,7 +288,6 @@ pub fn divide(
290
288
}
291
289
}
292
290
293
- //xy/z = x/z * y | y/z * x
294
291
( Parameters :: Mul ( s1, s2) , Parameters :: Var ( x, y, z) ) => {
295
292
let first = mult (
296
293
divide ( * s1. clone ( ) , Parameters :: Var ( x. clone ( ) , y, z. clone ( ) ) , ram) ,
@@ -311,7 +308,7 @@ pub fn divide(
311
308
first
312
309
}
313
310
}
314
- //xy/ab = x/ab * y/1 | y/ab * x
311
+
315
312
( Parameters :: Mul ( s1, s2) , Parameters :: Mul ( s3, s4) ) => {
316
313
let first = mult (
317
314
divide ( * s1. clone ( ) , mult ( * s3. clone ( ) , * s4. clone ( ) , ram) , ram) ,
@@ -332,7 +329,6 @@ pub fn divide(
332
329
}
333
330
}
334
331
335
- //xy/a = x/a * y | y/a * x
336
332
( Parameters :: Mul ( s1, s2) , Parameters :: Identifier ( s) ) => {
337
333
let first = mult (
338
334
divide (
@@ -361,6 +357,7 @@ pub fn divide(
361
357
first
362
358
}
363
359
}
360
+
364
361
( Parameters :: Identifier ( s) , Parameters :: Mul ( s1, s2) ) => {
365
362
let first = mult (
366
363
divide (
@@ -390,7 +387,6 @@ pub fn divide(
390
387
}
391
388
}
392
389
393
- //(s1s2/a => s1/a * s2
394
390
( Parameters :: Mul ( s1, s2) , Parameters :: Int ( i) ) => {
395
391
let first = mult (
396
392
divide ( * s1. clone ( ) , Parameters :: Int ( i) , ram) ,
@@ -412,15 +408,14 @@ pub fn divide(
412
408
}
413
409
}
414
410
415
- //a/xy = a/x * 1/y | 1/x * a/y
416
411
( Parameters :: Int ( i) , Parameters :: Mul ( s1, s2) ) => {
417
412
let first = mult (
418
413
divide ( Parameters :: Int ( i) , * s1. clone ( ) , ram) ,
419
414
divide ( Parameters :: Int ( 1 ) , * s2. clone ( ) , ram) ,
420
415
ram,
421
416
) ;
422
417
let second = mult (
423
- divide ( Parameters :: Int ( i ) , * s1. clone ( ) , ram) ,
418
+ divide ( Parameters :: Int ( 1 ) , * s1. clone ( ) , ram) ,
424
419
divide ( Parameters :: Int ( i) , * s2. clone ( ) , ram) ,
425
420
ram,
426
421
) ;
@@ -455,15 +450,14 @@ pub fn divide(
455
450
}
456
451
}
457
452
458
- //a/xy = a/x * 1/y | 1/x * a/y
459
453
( Parameters :: Float ( f) , Parameters :: Mul ( s1, s2) ) => {
460
454
let first = mult (
461
455
divide ( Parameters :: Float ( f) , * s1. clone ( ) , ram) ,
462
456
divide ( Parameters :: Int ( 1 ) , * s2. clone ( ) , ram) ,
463
457
ram,
464
458
) ;
465
459
let second = mult (
466
- divide ( Parameters :: Float ( f ) , * s1. clone ( ) , ram) ,
460
+ divide ( Parameters :: Int ( 1 ) , * s1. clone ( ) , ram) ,
467
461
divide ( Parameters :: Float ( f) , * s2. clone ( ) , ram) ,
468
462
ram,
469
463
) ;
@@ -498,15 +492,14 @@ pub fn divide(
498
492
}
499
493
}
500
494
501
- //a/xy = a/x * 1/y | 1/x * a/y
502
495
( Parameters :: Rational ( r) , Parameters :: Mul ( s1, s2) ) => {
503
496
let first = mult (
504
497
divide ( Parameters :: Rational ( r. clone ( ) ) , * s1. clone ( ) , ram) ,
505
498
divide ( Parameters :: Int ( 1 ) , * s2. clone ( ) , ram) ,
506
499
ram,
507
500
) ;
508
501
let second = mult (
509
- divide ( Parameters :: Rational ( r . clone ( ) ) , * s1. clone ( ) , ram) ,
502
+ divide ( Parameters :: Int ( 1 ) , * s1. clone ( ) , ram) ,
510
503
divide ( Parameters :: Rational ( r. clone ( ) ) , * s2. clone ( ) , ram) ,
511
504
ram,
512
505
) ;
@@ -519,29 +512,51 @@ pub fn divide(
519
512
first
520
513
}
521
514
}
522
- //(x*y)*(a+b) = x*y*a+x*y*b
523
- ( Parameters :: Mul ( s1, s2) , Parameters :: Plus ( s3, s4) ) => Parameters :: Plus (
524
- Box :: from ( mult ( mult ( * s1. clone ( ) , * s3. clone ( ) , ram) , * s2. clone ( ) , ram) ) ,
525
- Box :: from ( mult ( mult ( * s1. clone ( ) , * s4. clone ( ) , ram) , * s2. clone ( ) , ram) ) ,
526
- ) ,
527
515
528
- ( Parameters :: Plus ( s3, s4) , Parameters :: Mul ( s1, s2) ) => Parameters :: Plus (
529
- Box :: from ( mult ( mult ( * s1. clone ( ) , * s3. clone ( ) , ram) , * s2. clone ( ) , ram) ) ,
530
- Box :: from ( mult ( mult ( * s1. clone ( ) , * s4. clone ( ) , ram) , * s2. clone ( ) , ram) ) ,
531
- ) ,
516
+ //(xy)/(a+b) = x/(a+b) * y/1
517
+ ( Parameters :: Mul ( s1, s2) , Parameters :: Plus ( s3, s4) ) => {
518
+ let first = mult (
519
+ divide ( * s1. clone ( ) , add ( * s3. clone ( ) , * s4. clone ( ) , ram) , ram) ,
520
+ divide ( Parameters :: Int ( 1 ) , * s2. clone ( ) , ram) ,
521
+ ram,
522
+ ) ;
523
+ let second = mult (
524
+ divide ( Parameters :: Int ( 1 ) , * s1. clone ( ) , ram) ,
525
+ divide ( * s2. clone ( ) , add ( * s3. clone ( ) , * s4. clone ( ) , ram) , ram) ,
526
+ ram,
527
+ ) ;
528
+
529
+ let ( ss1, ss2) = ( size ( & first) , size ( & second) ) ;
530
+
531
+ if ss1 > ss2 {
532
+ second
533
+ } else {
534
+ first
535
+ }
536
+ }
532
537
533
- ( Parameters :: Null , Parameters :: Mul ( s1, s2) ) => Parameters :: Mul ( s1. clone ( ) , s2. clone ( ) ) ,
538
+ //(x+y)/ab = x/ab + y/ab
539
+ ( Parameters :: Plus ( s3, s4) , Parameters :: Mul ( s1, s2) ) => {
540
+ let first = add (
541
+ divide ( * s3. clone ( ) , mult ( * s1. clone ( ) , * s2. clone ( ) , ram) , ram) ,
542
+ divide ( * s4. clone ( ) , mult ( * s1. clone ( ) , * s2. clone ( ) , ram) , ram) ,
543
+ ram,
544
+ ) ;
545
+ first
546
+ }
547
+
548
+ ( Parameters :: Null , Parameters :: Mul ( s1, s2) ) => mult ( * s1. clone ( ) , * s2. clone ( ) , ram) ,
534
549
535
- ( Parameters :: Mul ( s1, s2) , Parameters :: Null ) => Parameters :: Mul ( s1. clone ( ) , s2. clone ( ) ) ,
550
+ ( Parameters :: Mul ( s1, s2) , Parameters :: Null ) => mult ( * s1. clone ( ) , * s2. clone ( ) , ram ) ,
536
551
537
552
( Parameters :: Var ( x, y, z) , Parameters :: Var ( x1, y1, z1) ) => {
538
553
if z == z1 {
539
- Parameters :: Var ( Box :: from ( mult ( * x. clone ( ) , * x1. clone ( ) , ram) ) , y + y1, z)
554
+ Parameters :: Var ( Box :: from ( divide ( * x. clone ( ) , * x1. clone ( ) , ram) ) , y - y1, z)
540
555
} else {
541
- Parameters :: Mul (
556
+ Parameters :: Div (
542
557
Box :: from ( Parameters :: Var ( x. clone ( ) , y. clone ( ) , z. clone ( ) ) ) ,
543
558
Box :: from ( Parameters :: Var (
544
- Box :: from ( mult ( Parameters :: Int ( 1 ) , * x1. clone ( ) , ram) ) ,
559
+ Box :: from ( divide ( Parameters :: Int ( 1 ) , * x1. clone ( ) , ram) ) ,
545
560
y1. clone ( ) ,
546
561
z1. clone ( ) ,
547
562
) ) ,
@@ -552,9 +567,9 @@ pub fn divide(
552
567
//2x*x
553
568
( Parameters :: Var ( x, y, z) , Parameters :: Identifier ( s) ) => {
554
569
if z == s {
555
- Parameters :: Var ( Box :: from ( x. clone ( ) ) , y + 1 , z)
570
+ Parameters :: Var ( Box :: from ( x. clone ( ) ) , y - 1 , z)
556
571
} else {
557
- Parameters :: Mul (
572
+ Parameters :: Div (
558
573
Box :: from ( Parameters :: Var ( x. clone ( ) , y. clone ( ) , z. clone ( ) ) ) ,
559
574
Box :: from ( Parameters :: Var ( Box :: from ( Parameters :: Int ( 1 ) ) , 1 , s. clone ( ) ) ) ,
560
575
)
@@ -563,51 +578,55 @@ pub fn divide(
563
578
564
579
( Parameters :: Identifier ( s) , Parameters :: Var ( x, y, z) ) => {
565
580
if z == s {
566
- Parameters :: Var ( Box :: from ( x. clone ( ) ) , y + 1 , z)
581
+ Parameters :: Var (
582
+ Box :: from ( divide ( Parameters :: Int ( 1 ) , * x. clone ( ) , ram) ) ,
583
+ 1 - y,
584
+ z,
585
+ )
567
586
} else {
568
- Parameters :: Mul (
587
+ Parameters :: Div (
588
+ Box :: from ( Parameters :: Var ( Box :: from ( Parameters :: Int ( 1 ) ) , 1 , s. clone ( ) ) ) ,
569
589
Box :: from ( Parameters :: Var (
570
590
Box :: from ( mult ( Parameters :: Int ( 1 ) , * x. clone ( ) , ram) ) ,
571
591
y. clone ( ) ,
572
592
z. clone ( ) ,
573
593
) ) ,
574
- Box :: from ( Parameters :: Var ( Box :: from ( Parameters :: Int ( 1 ) ) , 1 , s. clone ( ) ) ) ,
575
594
)
576
595
}
577
596
}
578
597
579
598
( Parameters :: Int ( i) , Parameters :: Var ( x, y, z) ) => Parameters :: Var (
580
- Box :: from ( mult ( * x . clone ( ) , Parameters :: Int ( i) , ram) ) ,
581
- y,
599
+ Box :: from ( divide ( Parameters :: Int ( i) , * x . clone ( ) , ram) ) ,
600
+ - y,
582
601
z. clone ( ) ,
583
602
) ,
584
603
585
604
( Parameters :: Var ( x, y, z) , Parameters :: Int ( i) ) => Parameters :: Var (
586
- Box :: from ( mult ( * x. clone ( ) , Parameters :: Int ( i) , ram) ) ,
605
+ Box :: from ( divide ( * x. clone ( ) , Parameters :: Int ( i) , ram) ) ,
587
606
y,
588
607
z. clone ( ) ,
589
608
) ,
590
609
591
610
( Parameters :: Float ( f) , Parameters :: Var ( x, y, z) ) => Parameters :: Var (
592
- Box :: from ( mult ( Parameters :: Float ( f) , * x. clone ( ) , ram) ) ,
593
- y,
611
+ Box :: from ( divide ( Parameters :: Float ( f) , * x. clone ( ) , ram) ) ,
612
+ - y,
594
613
z. clone ( ) ,
595
614
) ,
596
615
597
616
( Parameters :: Var ( x, y, z) , Parameters :: Float ( f) ) => Parameters :: Var (
598
- Box :: from ( mult ( * x. clone ( ) , Parameters :: Float ( f) , ram) ) ,
617
+ Box :: from ( divide ( * x. clone ( ) , Parameters :: Float ( f) , ram) ) ,
599
618
y,
600
619
z. clone ( ) ,
601
620
) ,
602
621
603
622
( Parameters :: Rational ( r) , Parameters :: Var ( x, y, z) ) => Parameters :: Var (
604
- Box :: from ( mult ( Parameters :: Rational ( r. clone ( ) ) , * x. clone ( ) , ram) ) ,
605
- y,
623
+ Box :: from ( divide ( Parameters :: Rational ( r. clone ( ) ) , * x. clone ( ) , ram) ) ,
624
+ - y,
606
625
z. clone ( ) ,
607
626
) ,
608
627
609
628
( Parameters :: Var ( x, y, z) , Parameters :: Rational ( r) ) => Parameters :: Var (
610
- Box :: from ( mult ( * x. clone ( ) , Parameters :: Rational ( r) , ram) ) ,
629
+ Box :: from ( divide ( * x. clone ( ) , Parameters :: Rational ( r. clone ( ) ) , ram) ) ,
611
630
y,
612
631
z. clone ( ) ,
613
632
) ,
0 commit comments