Skip to content

Commit 216b375

Browse files
author
Charlotte Thomas
committed
implements add mul/plus/var to div 4/4
add copy to derived traits for Rationals add Float(1,-1) and Rationals(1/1,-1/1) to pretty printing
1 parent df4187e commit 216b375

File tree

3 files changed

+95
-54
lines changed

3 files changed

+95
-54
lines changed

src/exact_math/rationals.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::{fmt::Display, ops};
22

33
use crate::utils::integer_utils::gcd;
44

5-
#[derive(Debug, Clone)]
5+
#[derive(Debug, Clone, Copy)]
66
pub struct Rationals {
77
pub under: i64,
88
pub over: i64,

src/functions/divide.rs

Lines changed: 65 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,10 @@ pub fn divide(
6060
ram,
6161
divide,
6262
),
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,
7067
),
7168
},
7269

@@ -181,6 +178,7 @@ pub fn divide(
181178
);
182179
first
183180
}
181+
//(x+y)/a = x/a + y/a
184182
(Parameters::Plus(s1, s2), Parameters::Identifier(s3)) => {
185183
let first = add(
186184
divide(
@@ -197,6 +195,7 @@ pub fn divide(
197195
);
198196
first
199197
}
198+
200199
(Parameters::Identifier(s3), Parameters::Plus(s1, s2)) => {
201200
let first = Parameters::Div(
202201
Box::from(Parameters::Var(Box::new(Parameters::Int(1)), 1, s3.clone())),
@@ -268,7 +267,6 @@ pub fn divide(
268267

269268
(Parameters::Plus(s1, s2), Parameters::Null) => add(*s1.clone(), *s2.clone(), ram),
270269

271-
//x/yz = x/y * 1/z | 1/y * x/z
272270
(Parameters::Var(x, y, z), Parameters::Mul(s1, s2)) => {
273271
let first = mult(
274272
divide(Parameters::Var(x.clone(), y, z.clone()), *s1.clone(), ram),
@@ -290,7 +288,6 @@ pub fn divide(
290288
}
291289
}
292290

293-
//xy/z = x/z * y | y/z * x
294291
(Parameters::Mul(s1, s2), Parameters::Var(x, y, z)) => {
295292
let first = mult(
296293
divide(*s1.clone(), Parameters::Var(x.clone(), y, z.clone()), ram),
@@ -311,7 +308,7 @@ pub fn divide(
311308
first
312309
}
313310
}
314-
//xy/ab = x/ab * y/1 | y/ab * x
311+
315312
(Parameters::Mul(s1, s2), Parameters::Mul(s3, s4)) => {
316313
let first = mult(
317314
divide(*s1.clone(), mult(*s3.clone(), *s4.clone(), ram), ram),
@@ -332,7 +329,6 @@ pub fn divide(
332329
}
333330
}
334331

335-
//xy/a = x/a * y | y/a * x
336332
(Parameters::Mul(s1, s2), Parameters::Identifier(s)) => {
337333
let first = mult(
338334
divide(
@@ -361,6 +357,7 @@ pub fn divide(
361357
first
362358
}
363359
}
360+
364361
(Parameters::Identifier(s), Parameters::Mul(s1, s2)) => {
365362
let first = mult(
366363
divide(
@@ -390,7 +387,6 @@ pub fn divide(
390387
}
391388
}
392389

393-
//(s1s2/a => s1/a * s2
394390
(Parameters::Mul(s1, s2), Parameters::Int(i)) => {
395391
let first = mult(
396392
divide(*s1.clone(), Parameters::Int(i), ram),
@@ -412,15 +408,14 @@ pub fn divide(
412408
}
413409
}
414410

415-
//a/xy = a/x * 1/y | 1/x * a/y
416411
(Parameters::Int(i), Parameters::Mul(s1, s2)) => {
417412
let first = mult(
418413
divide(Parameters::Int(i), *s1.clone(), ram),
419414
divide(Parameters::Int(1), *s2.clone(), ram),
420415
ram,
421416
);
422417
let second = mult(
423-
divide(Parameters::Int(i), *s1.clone(), ram),
418+
divide(Parameters::Int(1), *s1.clone(), ram),
424419
divide(Parameters::Int(i), *s2.clone(), ram),
425420
ram,
426421
);
@@ -455,15 +450,14 @@ pub fn divide(
455450
}
456451
}
457452

458-
//a/xy = a/x * 1/y | 1/x * a/y
459453
(Parameters::Float(f), Parameters::Mul(s1, s2)) => {
460454
let first = mult(
461455
divide(Parameters::Float(f), *s1.clone(), ram),
462456
divide(Parameters::Int(1), *s2.clone(), ram),
463457
ram,
464458
);
465459
let second = mult(
466-
divide(Parameters::Float(f), *s1.clone(), ram),
460+
divide(Parameters::Int(1), *s1.clone(), ram),
467461
divide(Parameters::Float(f), *s2.clone(), ram),
468462
ram,
469463
);
@@ -498,15 +492,14 @@ pub fn divide(
498492
}
499493
}
500494

501-
//a/xy = a/x * 1/y | 1/x * a/y
502495
(Parameters::Rational(r), Parameters::Mul(s1, s2)) => {
503496
let first = mult(
504497
divide(Parameters::Rational(r.clone()), *s1.clone(), ram),
505498
divide(Parameters::Int(1), *s2.clone(), ram),
506499
ram,
507500
);
508501
let second = mult(
509-
divide(Parameters::Rational(r.clone()), *s1.clone(), ram),
502+
divide(Parameters::Int(1), *s1.clone(), ram),
510503
divide(Parameters::Rational(r.clone()), *s2.clone(), ram),
511504
ram,
512505
);
@@ -519,29 +512,51 @@ pub fn divide(
519512
first
520513
}
521514
}
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-
),
527515

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+
}
532537

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),
534549

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),
536551

537552
(Parameters::Var(x, y, z), Parameters::Var(x1, y1, z1)) => {
538553
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)
540555
} else {
541-
Parameters::Mul(
556+
Parameters::Div(
542557
Box::from(Parameters::Var(x.clone(), y.clone(), z.clone())),
543558
Box::from(Parameters::Var(
544-
Box::from(mult(Parameters::Int(1), *x1.clone(), ram)),
559+
Box::from(divide(Parameters::Int(1), *x1.clone(), ram)),
545560
y1.clone(),
546561
z1.clone(),
547562
)),
@@ -552,9 +567,9 @@ pub fn divide(
552567
//2x*x
553568
(Parameters::Var(x, y, z), Parameters::Identifier(s)) => {
554569
if z == s {
555-
Parameters::Var(Box::from(x.clone()), y + 1, z)
570+
Parameters::Var(Box::from(x.clone()), y - 1, z)
556571
} else {
557-
Parameters::Mul(
572+
Parameters::Div(
558573
Box::from(Parameters::Var(x.clone(), y.clone(), z.clone())),
559574
Box::from(Parameters::Var(Box::from(Parameters::Int(1)), 1, s.clone())),
560575
)
@@ -563,51 +578,55 @@ pub fn divide(
563578

564579
(Parameters::Identifier(s), Parameters::Var(x, y, z)) => {
565580
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+
)
567586
} else {
568-
Parameters::Mul(
587+
Parameters::Div(
588+
Box::from(Parameters::Var(Box::from(Parameters::Int(1)), 1, s.clone())),
569589
Box::from(Parameters::Var(
570590
Box::from(mult(Parameters::Int(1), *x.clone(), ram)),
571591
y.clone(),
572592
z.clone(),
573593
)),
574-
Box::from(Parameters::Var(Box::from(Parameters::Int(1)), 1, s.clone())),
575594
)
576595
}
577596
}
578597

579598
(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,
582601
z.clone(),
583602
),
584603

585604
(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)),
587606
y,
588607
z.clone(),
589608
),
590609

591610
(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,
594613
z.clone(),
595614
),
596615

597616
(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)),
599618
y,
600619
z.clone(),
601620
),
602621

603622
(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,
606625
z.clone(),
607626
),
608627

609628
(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)),
611630
y,
612631
z.clone(),
613632
),

src/parsing/ast.rs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ pub enum Ast {
5555
fn int_to_superscript_string(i: i64) -> String {
5656
fn digit_to_superscript_char(i: &str) -> &str {
5757
match i {
58+
"-" => "⁻",
5859
"0" => "⁰",
5960
"1" => "¹",
6061
"2" => "²",
@@ -77,7 +78,9 @@ fn int_to_superscript_string(i: i64) -> String {
7778
.for_each(|f| vec.push(f));
7879

7980
let i = vec.join("");
80-
if i == "0".to_string() || i == "¹".to_string() {
81+
if i == "⁰".to_string() {
82+
"error".to_string()
83+
} else if i == "¹" {
8184
"".to_string()
8285
} else {
8386
i
@@ -166,12 +169,31 @@ impl Parameters {
166169
}
167170
}
168171

169-
Var(x, y, z) => match **x {
170-
Int(1) => format!("{}{}", z, int_to_superscript_string(*y)),
171-
Int(-1) => format!("-{}{}", z, int_to_superscript_string(*y)),
172-
Int(0) => format!("0"),
173-
_ => format!("{}", Var(x.clone(), y.clone(), z.clone())),
174-
},
172+
Var(x, y, z) => {
173+
let l = int_to_superscript_string(*y);
174+
if l == "error".to_string() {
175+
format!("{}", x.clone())
176+
} else {
177+
match **x {
178+
Int(1) => format!("{}{}", z, int_to_superscript_string(*y)),
179+
Float(f) if f >= 1.0 - 1e10 && f <= 1.0 + 1e10 => {
180+
format!("{}{}", z, int_to_superscript_string(*y))
181+
}
182+
Rational(r) if r.clone() == Rationals::new(1, 1) => {
183+
format!("{}{}", z, int_to_superscript_string(*y))
184+
}
185+
Int(-1) => format!("-{}{}", z, int_to_superscript_string(*y)),
186+
Float(f) if f <= -1.0 - 1e10 && f >= -1.0 + 1e10 => {
187+
format!("-{}{}", z, int_to_superscript_string(*y))
188+
}
189+
Rational(r) if r.clone() == Rationals::new(-1, 1) => {
190+
format!("-{}{}", z, int_to_superscript_string(*y))
191+
}
192+
Int(0) => format!("0"),
193+
_ => format!("{}", Var(x.clone(), y.clone(), z.clone())),
194+
}
195+
}
196+
}
175197

176198
Mul(x, y) => {
177199
let x_printed = x.pretty_print(

0 commit comments

Comments
 (0)