82 lines
2.6 KiB
Markdown
82 lines
2.6 KiB
Markdown
# 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 :
|
|
- sign
|
|
- coefficient
|
|
- exponent
|
|
4. print reduced form
|
|
-> print reduced form
|
|
-> if degree 1 :
|
|
- if c = 0 -> print "any real is a solution"
|
|
- if c != 0 -> print "no solution"
|
|
-> if degree 2 :
|
|
- print degree
|
|
-> if degree 3 :
|
|
- print degree
|
|
5. solve
|
|
-> degree 1 :
|
|
-> ax + b = 0 <=> ax = -b <=> x = -b / a
|
|
-> solution :
|
|
- a; // double
|
|
- b; // double
|
|
- solution_gcd; // gcd(b, a)
|
|
- solution_numerator; // -b / gcd
|
|
- solution_denominator; // a / gcd
|
|
- solution; // double (-b / a)
|
|
-> degree 2 :
|
|
-> discriminant : Δ = b² - 4ac
|
|
-> Δ > 0 -> 2 solutions : x = ( -b / 2a ) +- ( √|Δ| / 2a )
|
|
-> Δ == 0 -> 1 solution : x = ( -b / 2a )
|
|
-> Δ < 0 -> 2 solutions : x = ( -b / 2a ) +- i( √|Δ| / 2a )
|
|
-> solution :
|
|
- a; // double
|
|
- b; // double
|
|
- c; // double
|
|
- 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
|
|
6. print solution
|