severalgos/3np1 mod problem C++  June 21, 2020
lib_3np1_mod__inline.hpp
Go to the documentation of this file.
1 /* -*- coding: latin-1 -*- */
2 /** \file lib_3np1_mod__inline.hpp
3  *
4  * Piece of severalgos.
5  * https://bitbucket.org/OPiMedia/severalgos
6  *
7  * GPLv3 --- Copyright (C) 2015 Olivier Pirson
8  * http://www.opimedia.be/
9  */
10 
11 #include <cassert>
12 
13 #include <limits>
14 
15 
16 
17 namespace lib_3np1_mod {
18 
19 /* ***********
20  * Functions *
21  *************/
22 inline
25  assert(n <= (std::numeric_limits<value_type>::max() - 1)/3);
26 
27  return ((n & 1) == 0
28  ? n >> 1 // even
29  : n*3 + 1); // odd
30 }
31 
32 
33 inline
36  assert(n <= mask);
37 
38  return ((n & 1) == 0
39  ? n >> 1 // even
40  : (n*3 + 1) & mask); // odd
41 }
42 
43 
44 inline
47  assert(n <= (std::numeric_limits<value_type>::max() - 1)/3);
48 
49  if ((n & 1) != 0) { // odd
50  n = n*3 + 1;
51  }
52 
53  return (n != 0
54  ? n >> m2(n)
55  : 0);
56 }
57 
58 
59 inline
62  assert(n <= mask);
63 
64  if ((n & 1) != 0) { // odd
65  n = (n*3 + 1) & mask;
66  }
67 
68  return (n != 0
69  ? n >> m2(n)
70  : 0);
71 }
72 
73 
74 inline
77  assert(n != 0);
78  assert(std::numeric_limits<value_type>::digits
79  <= std::numeric_limits<unsigned long long>::digits); // NOLINT
80 
81  return __builtin_ctzll(n);
82 }
83 
84 
85 inline
88  assert(n <= (std::numeric_limits<value_type>::max() - 1)/3);
89 
90  return ((n & 1) == 0
91  ? n // even
92  : n*3 + 1) >> 1; // odd
93 }
94 
95 
96 inline
99  assert(n <= mask);
100 
101  return ((n & 1) == 0
102  ? n // even
103  : (n*3 + 1) & mask) >> 1; // odd
104 }
105 
106 } // namespace lib_3np1_mod
value_type m2(value_type n)
function.
value_type C_mask(value_type n, value_type mask)
Return if n even, if n odd.
value_type F(value_type n)
F odd function.
value_type F_mask(value_type n, value_type mask)
Return if n even if n odd which k as large as possible = .
value_type C(value_type n)
Collatz C function.
value_type T(value_type n)
Terras T function.
value_type T_mask(value_type n, value_type mask)
Return if n even if n odd.
uint64_t value_type