snippets 0.1.0
Loading...
Searching...
No Matches
rational_number.hpp
Go to the documentation of this file.
1#ifndef RATIONAL_NUMBER_H
2#define RATIONAL_NUMBER_H
3
4#include "big_integer.hpp"
5#include <stdexcept>
6#include <utility>
7#include <string>
8
9namespace hsc_snippets {
11 private:
12 BigInteger nominator;
13 BigInteger denominator;
14
15 // Private Constructor
16 RationalNumber(BigInteger nominator, BigInteger denominator)
17 : nominator(std::move(nominator)), denominator(std::move(denominator)) {
18 if (this->denominator == BigInteger::zero()) {
19 throw std::invalid_argument("Denominator cannot be zero.");
20 }
21 // Ensure denominator is positive
22 if (this->denominator < BigInteger::zero()) {
23 this->nominator = -this->nominator;
24 this->denominator = -this->denominator;
25 }
26 reduce();
27 }
28
29 void reduce() {
30 BigInteger gcd_value = BigInteger::gcd(nominator, denominator);
31 nominator /= gcd_value;
32 denominator /= gcd_value;
33 // Ensure denominator is positive
34 if (denominator < BigInteger::zero()) {
35 nominator = -nominator;
36 denominator = -denominator;
37 }
38 }
39
40 public:
49 static RationalNumber create(BigInteger nominator, BigInteger denominator) {
50 return {std::move(nominator), std::move(denominator)};
51 }
52
59 static RationalNumber create(BigInteger nominator) {
60 return {std::move(nominator), BigInteger::one()};
61 }
62
68 static const RationalNumber &zero() {
69 static RationalNumber zeroInstance = {BigInteger::zero(), BigInteger::one()};
70 return zeroInstance;
71 }
72
78 static const RationalNumber &one() {
79 static RationalNumber oneInstance = {BigInteger::one(), BigInteger::one()};
80 return oneInstance;
81 }
82
83 // Copy constructor
84 RationalNumber(const RationalNumber &other) = default;
85
86 // Move constructor
87 RationalNumber(RationalNumber &&other) noexcept = default;
88
89 // Copy assignment
90 RationalNumber &operator=(const RationalNumber &other) = default;
91
92 // Move assignment
93 RationalNumber &operator=(RationalNumber &&other) noexcept = default;
94
95 // Arithmetic operators
97 BigInteger n = nominator * other.denominator + other.nominator * denominator;
98 BigInteger d = denominator * other.denominator;
99 return {n, d};
100 }
101
103 BigInteger n = nominator * other.denominator - other.nominator * denominator;
104 BigInteger d = denominator * other.denominator;
105 return {n, d};
106 }
107
109 BigInteger n = nominator * other.nominator;
110 BigInteger d = denominator * other.denominator;
111 return {n, d};
112 }
113
115 if (other.nominator == BigInteger::zero()) {
116 throw std::invalid_argument("Division by zero.");
117 }
118 BigInteger n = nominator * other.denominator;
119 BigInteger d = denominator * other.nominator;
120 return {n, d};
121 }
122
123 // Compound assignment operators
125 *this = *this + other;
126 return *this;
127 }
128
130 *this = *this - other;
131 return *this;
132 }
133
135 *this = *this * other;
136 return *this;
137 }
138
140 *this = *this / other;
141 return *this;
142 }
143
144 // Unary minus operator
146 return {-nominator, denominator};
147 }
148
153 [[nodiscard]] RationalNumber inverse() const {
154 if (nominator == BigInteger::zero()) {
155 throw std::invalid_argument("Cannot invert a zero rational number.");
156 }
157 return {denominator, nominator};
158 }
159
160 // Negation function
161 [[nodiscard]] RationalNumber negate() const {
162 return {-nominator, denominator};
163 }
164
165 // Absolute value function
166 [[nodiscard]] RationalNumber abs() const {
167 return {nominator.abs(), denominator.abs()};
168 }
169
170 // Convert to string representation
171 [[nodiscard]] std::string to_string() const {
172 return nominator.to_string() + "/" + denominator.to_string();
173 }
174
175 // Comparison operators
176 bool operator==(const RationalNumber &other) const {
177 return nominator == other.nominator && denominator == other.denominator;
178 }
179
180 bool operator!=(const RationalNumber &other) const {
181 return !(*this == other);
182 }
183
184 bool operator<(const RationalNumber &other) const {
185 return nominator * other.denominator < other.nominator * denominator;
186 }
187
188 bool operator<=(const RationalNumber &other) const {
189 return nominator * other.denominator <= other.nominator * denominator;
190 }
191
192 bool operator>(const RationalNumber &other) const {
193 return nominator * other.denominator > other.nominator * denominator;
194 }
195
196 bool operator>=(const RationalNumber &other) const {
197 return nominator * other.denominator >= other.nominator * denominator;
198 }
199
200 // Getter functions
201 [[nodiscard]] const BigInteger &getNominator() const {
202 return nominator;
203 }
204
205 [[nodiscard]] const BigInteger &getDenominator() const {
206 return denominator;
207 }
208 };
209}
210
211#endif // RATIONAL_NUMBER_H
Implements a class for representing and manipulating large integers beyond the native integer range.
Definition big_integer.hpp:22
std::string to_string() const
Definition big_integer.hpp:170
static BigInteger gcd(const BigInteger &a, const BigInteger &b)
Definition big_integer.hpp:731
static const BigInteger & one()
Definition big_integer.hpp:257
BigInteger abs() const
Definition big_integer.hpp:345
static const BigInteger & zero()
Definition big_integer.hpp:248
Definition rational_number.hpp:10
bool operator<(const RationalNumber &other) const
Definition rational_number.hpp:184
bool operator>(const RationalNumber &other) const
Definition rational_number.hpp:192
const BigInteger & getNominator() const
Definition rational_number.hpp:201
RationalNumber & operator=(const RationalNumber &other)=default
static RationalNumber create(BigInteger nominator, BigInteger denominator)
Definition rational_number.hpp:49
RationalNumber negate() const
Definition rational_number.hpp:161
static const RationalNumber & one()
Definition rational_number.hpp:78
bool operator>=(const RationalNumber &other) const
Definition rational_number.hpp:196
RationalNumber & operator*=(const RationalNumber &other)
Definition rational_number.hpp:134
const BigInteger & getDenominator() const
Definition rational_number.hpp:205
RationalNumber abs() const
Definition rational_number.hpp:166
RationalNumber operator+(const RationalNumber &other) const
Definition rational_number.hpp:96
RationalNumber operator-(const RationalNumber &other) const
Definition rational_number.hpp:102
bool operator<=(const RationalNumber &other) const
Definition rational_number.hpp:188
bool operator==(const RationalNumber &other) const
Definition rational_number.hpp:176
RationalNumber operator-() const
Definition rational_number.hpp:145
static const RationalNumber & zero()
Definition rational_number.hpp:68
RationalNumber & operator=(RationalNumber &&other) noexcept=default
RationalNumber & operator-=(const RationalNumber &other)
Definition rational_number.hpp:129
RationalNumber operator/(const RationalNumber &other) const
Definition rational_number.hpp:114
bool operator!=(const RationalNumber &other) const
Definition rational_number.hpp:180
RationalNumber operator*(const RationalNumber &other) const
Definition rational_number.hpp:108
static RationalNumber create(BigInteger nominator)
Definition rational_number.hpp:59
RationalNumber & operator+=(const RationalNumber &other)
Definition rational_number.hpp:124
RationalNumber & operator/=(const RationalNumber &other)
Definition rational_number.hpp:139
RationalNumber inverse() const
Definition rational_number.hpp:153
RationalNumber(RationalNumber &&other) noexcept=default
RationalNumber(const RationalNumber &other)=default
std::string to_string() const
Definition rational_number.hpp:171
Definition big_integer.hpp:14