From 92e047bf9f19eba85ae5d30b122c6a0d060281ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 27 Sep 2017 16:16:47 +0200 Subject: [PATCH] [poincare/simplification] add integer fraction reduction transformation Change-Id: I28dfe64bceb0863c781e631f80ff2684b22670b9 --- poincare/src/simplification/Makefile | 1 + .../integer_fraction_reduction_transform.cpp | 23 +++++++++++++++++++ .../src/simplification/transform/transform.h | 1 + 3 files changed, 25 insertions(+) create mode 100644 poincare/src/simplification/transform/integer_fraction_reduction_transform.cpp diff --git a/poincare/src/simplification/Makefile b/poincare/src/simplification/Makefile index 4ccdddae9..efc48085b 100644 --- a/poincare/src/simplification/Makefile +++ b/poincare/src/simplification/Makefile @@ -23,6 +23,7 @@ objs += $(addprefix $(prefix)/,\ transform/remove_parenthesis_transform.o \ transform/subtraction_transform.o \ transform/integer_addition_transform.o \ + transform/integer_fraction_reduction_transform.o \ transform/integer_multiplication_transform.o \ transform/merge_dynamic_hierarchy_transform.o \ ) diff --git a/poincare/src/simplification/transform/integer_fraction_reduction_transform.cpp b/poincare/src/simplification/transform/integer_fraction_reduction_transform.cpp new file mode 100644 index 000000000..8d3a1c761 --- /dev/null +++ b/poincare/src/simplification/transform/integer_fraction_reduction_transform.cpp @@ -0,0 +1,23 @@ +#include "transform.h" +#include +#include +#include +#include +#include + +bool Poincare::Simplification::IntegerFractionReductionTransform(Expression * captures[]) { + Multiplication * m = static_cast(captures[0]); + Power * p = static_cast(captures[2]); + Integer * i1 = (Integer *)(captures[1]); + Integer * i2 = (Integer *)(captures[3]); + Integer gcd = Arithmetic::GCD(i1, i2); + Integer one(1); + if (gcd.compareTo(&one) == 0) { + return false; + } + Integer * r1 = new Integer(Integer::Division(*i1, gcd).quotient); + Integer * r2 = new Integer(Integer::Division(*i2, gcd).quotient); + m->replaceOperand(i1, r1, true); + p->replaceOperand(i2, r2, true); + return true; +} diff --git a/poincare/src/simplification/transform/transform.h b/poincare/src/simplification/transform/transform.h index fb54c4de8..28ebd0078 100644 --- a/poincare/src/simplification/transform/transform.h +++ b/poincare/src/simplification/transform/transform.h @@ -16,6 +16,7 @@ bool MergeDynamicHierarchyTransform(Expression * captures[]); bool IntegerAdditionTransform(Expression * captures[]); bool IntegerMultiplicationTransform(Expression * captures[]); bool PowerPowerTransform(Expression * captures[]); +bool IntegerFractionReductionTransform(Expression * captures[]); } }