# 42_EXT_05_computorv1


## ressources

- project intra : https://projects.intra.42.fr/projects/42cursus-computorv1 
- project luke : https://github.com/LuckyLaszlo/computorv1 

## install

this project uses submodules (maybe recursively), so either : 

- `git clone --recurse-submodules <repo-url>`
- or, after cloning : `git submodule update --init --recursive`

## steps

1. lexer
    -> tokens types : 
      - TOKEN_VARIABLE      // x, y, etc.
      - TOKEN_NUMBER_INT    // int
      - TOKEN_NUMBER_DOUBLE // double
      - TOKEN_POWER         // ^ or **
      - TOKEN_SIGN_PLUS     // +
      - TOKEN_SIGN_MINUS    // -
      - TOKEN_FACTOR_MULT   // *
      - TOKEN_FACTOR_DIV    // / or :
      - TOKEN_EQUAL         // =
      - END                 // null
2. parser
    -> terms : 
      - POSITION    // left or righ from =
      - SIGN        // + or -
      - COEFFICIENT // double
      - EXPONENT    // double
3. reduce
    -> polynom : 
      - 0
      - 1
      - 2
      - 3
      - ...
4. print reduced form
5. find degree
6. print degree
7. solve
    -> discriminant          : Δ = b² - 4ac
    -> Δ > 0  -> 2 solutions : x = ( -b / 2a ) +-  ( √|Δ| / 2a )
    -> Δ == 0 ->             : x = ( -b / 2a )
    -> Δ < 0  -> 2 solutions : x = ( -b / 2a ) +- i( √|Δ| / 2a )
    -> solution : 
      - delta_sign;              // + or -
      - delta_absolute;          // |Δ|
      - first_term_gcd;          // gcd(b, 2a)
      - first_term_numerator;    // -b / gcd
      - first_term_denominator;  // 2a / gcd
      - first_term;              // double (-b / 2a)
      - second_term_gcd;         // gcd(√|Δ|, 2a)
      - second_term_numerator;   // √|Δ| / gcd
      - second_term_denominator; // 2a / gcd
      - second_term;             // double (√|Δ| / 2a)
      - double solution1;        // first_term + second_term
      - double solution2;        // first_term - second_term
8. print solution
