Write an implementation (class Lfraction) for an abstract data type "Fraction", where the fraction consists of two long integers: numerator and denominator. Always convert fractions to a form, where denominator is strictly positive and the fraction is reduced. By default all operations (described on webpage http://www.itcollege.ee/~jpoial/algoritmid/Lfraction/index.html ) must be exact and use integer arithmetics only (e.g. do not use floating point arithmetics to compare two fractions).

Remark 1. In addition to public methods listed you may need a method to find the greatest common divisor of two integers to reduce the fractions.
Remark 2. Operations must not modify operands, a new fraction must be created for the result.
Remark 3. Methods toString and valueOf must be dual: method valueOf must be able to interpret all strings generated by the method toString .
Remark 4. If an error occurs (division by zero, illegal string, etc.) the program must throw an exception of class RuntimeException (or any appropriate subclass of RuntimeException).
Remark 5. Sign of a fraction is in numerator and integer numbers expressed as fractions must have denominator 1, e.g. 3 is 3/1 , -5 is (-5)/1 and 0 is 0/1 .

Realiseerida abstraktne andmetüüp "murd pikkade täisarvude paarina".
Murdu esindab objekt klassist Lfraction, mis sisaldab murru lugejat (ingl.k. numerator) ja murru nimetajat (ingl.k. denominator) pikkade täisarvudena (teha nii, et nimetaja oleks alati rangelt positiivne ning murd taandatud).
Realiseerida kõik operatsioonid, mis on kirjeldatud programmitoorikus (ja veebilehel http://www.itcollege.ee/~jpoial/algoritmid/Lfraction/index.html ). Murdude võrdlus peab olema täpne, s.t. toetuma arvutustele täisarvudega, mitte reaalarvuliste lähiväärtustega.

Märkus 1. Lisaks loetletud avalikele meetoditele on teil tõenäoliselt tarvis murru taandamise meetodit ja võib-olla ka kahe täisarvu suurima ühisteguri leidmise meetodit.
Märkus 2. Reeglina ei tohi meetodid muuta objekti, millele neid rakendatakse (näit. liitmisel ei tohi muuta liidetavaid, tuleb summa jaoks luua uus murd).
Märkus 3. Sõne teisendamisel murruks peab valueOf-meetod olema kooskõlas toString-meetodiga (peab oskama tõlgendada niisugust sõnet, mida toString tagastab).
Märkus 4. Veasituatsioonid (sõne, mida ei saa teisendada; nulliga jagamine jt.) peavad tekitama erindi klassist RuntimeException või mõnest selle klassi sobivast alamklassist.
Märkus 5. Murru märk käib lugeja juurde ning täisarvude nimetaja on 1 (ka arvu 0 puhul).