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}