malachite_nz/integer/arithmetic/neg.rs
1// Copyright © 2025 Mikhail Hogrefe
2//
3// This file is part of Malachite.
4//
5// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
6// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
7// 3 of the License, or (at your option) any later version. See <https://www.gnu.org/licenses/>.
8
9use crate::integer::Integer;
10use core::ops::Neg;
11use malachite_base::num::arithmetic::traits::NegAssign;
12use malachite_base::num::basic::traits::Zero;
13use malachite_base::num::logic::traits::NotAssign;
14
15impl Neg for Integer {
16 type Output = Self;
17
18 /// Negates an [`Integer`], taking it by value.
19 ///
20 /// $$
21 /// f(x) = -x.
22 /// $$
23 ///
24 /// # Worst-case complexity
25 /// Constant time and additional memory.
26 ///
27 /// # Examples
28 /// ```
29 /// use malachite_base::num::basic::traits::Zero;
30 /// use malachite_nz::integer::Integer;
31 ///
32 /// assert_eq!(-Integer::ZERO, 0);
33 /// assert_eq!(-Integer::from(123), -123);
34 /// assert_eq!(-Integer::from(-123), 123);
35 /// ```
36 fn neg(mut self) -> Self {
37 if self.abs != 0 {
38 self.sign.not_assign();
39 }
40 self
41 }
42}
43
44impl Neg for &Integer {
45 type Output = Integer;
46
47 /// Negates an [`Integer`], taking it by reference.
48 ///
49 /// $$
50 /// f(x) = -x.
51 /// $$
52 ///
53 /// # Worst-case complexity
54 /// $T(n) = O(n)$
55 ///
56 /// $M(n) = O(n)$
57 ///
58 /// where $T$ is time, $M$ is additional memory, and $n$ is `self.significant_bits()`.
59 ///
60 /// # Examples
61 /// ```
62 /// use malachite_base::num::basic::traits::Zero;
63 /// use malachite_nz::integer::Integer;
64 ///
65 /// assert_eq!(-&Integer::ZERO, 0);
66 /// assert_eq!(-&Integer::from(123), -123);
67 /// assert_eq!(-&Integer::from(-123), 123);
68 /// ```
69 fn neg(self) -> Integer {
70 if self.abs == 0 {
71 Integer::ZERO
72 } else {
73 Integer {
74 sign: !self.sign,
75 abs: self.abs.clone(),
76 }
77 }
78 }
79}
80
81impl NegAssign for Integer {
82 /// Negates an [`Integer`] in place.
83 ///
84 /// $$
85 /// x \gets -x.
86 /// $$
87 ///
88 /// # Worst-case complexity
89 /// Constant time and additional memory.
90 ///
91 /// # Examples
92 /// ```
93 /// use malachite_base::num::arithmetic::traits::NegAssign;
94 /// use malachite_base::num::basic::traits::Zero;
95 /// use malachite_nz::integer::Integer;
96 ///
97 /// let mut x = Integer::ZERO;
98 /// x.neg_assign();
99 /// assert_eq!(x, 0);
100 ///
101 /// let mut x = Integer::from(123);
102 /// x.neg_assign();
103 /// assert_eq!(x, -123);
104 ///
105 /// let mut x = Integer::from(-123);
106 /// x.neg_assign();
107 /// assert_eq!(x, 123);
108 /// ```
109 fn neg_assign(&mut self) {
110 if self.abs != 0 {
111 self.sign.not_assign();
112 }
113 }
114}