Calculating the largest known prime in Ruby(jpcamara.com)
jpcamara.com
Calculating the largest known prime in Ruby
https://jpcamara.com/2024/11/26/looking-to-impress.html
11 comments
Nice. You can do the same in Python like so and surprisingly it only takes a couple seconds to a minute to get the print out, no need for importing any special libraries (just `sys` to enable printing large numbers).
```python
import sys sys.set_int_max_str_digits(0) # Allows for printing very large numbers.
x = (2 * 136_279_841) - 1
print(x)
```
```python
import sys sys.set_int_max_str_digits(0) # Allows for printing very large numbers.
x = (2 * 136_279_841) - 1
print(x)
```
Use two leading spaces to create monospaced code on this site, like so:
import sys
sys.set_int_max_str_digits(0) # Allows for printing very large numbers
x = (2 ** 136_279_841) - 1
print(x)
Also, note that 1 << 136_279_841 is much faster than 2 ** 136_279_841; the former runs in <10ms, while the latter takes over 600ms on my machine (a 60x difference).Could explain the << calculation a bit? I read about the operator but it’s not clear how this works
It means "left shift" in binary. This corresponds to adding a specified number of zeros at the end of the binary representation of the original number. So 1 << 0 is binary 1, 1 << 1 is binary 10, 1 << 2 is binary 100, 1 << 3 is binary 1000...
If you think about the meaning of place value in binary, this is exactly the same as raising two to a specified power. Each time you shift one place further left in binary, it's equivalent to multiplying the existing number by two. So repeating that a specified number of times is multiplying by a specified power of two.
If you think about the meaning of place value in binary, this is exactly the same as raising two to a specified power. Each time you shift one place further left in binary, it's equivalent to multiplying the existing number by two. So repeating that a specified number of times is multiplying by a specified power of two.
1 is 2 to the power 0 ... 0b0001
shifted left once, it becomes 2 to the power 1 ... 0b0010
shifted left twice, it becomes 2 to the power 2 ... 0b0100
shifted left three times, it becomes 2 to the power 3 ... 0b1000
etc until
shifted left 136_279_841 times, it becomes 2 to the power 136_279_84 ... 0b1000...many zeros...0000
subtract 1, it becomes
0b0111...many ones...1111
shifted left once, it becomes 2 to the power 1 ... 0b0010
shifted left twice, it becomes 2 to the power 2 ... 0b0100
shifted left three times, it becomes 2 to the power 3 ... 0b1000
etc until
shifted left 136_279_841 times, it becomes 2 to the power 136_279_84 ... 0b1000...many zeros...0000
subtract 1, it becomes
0b0111...many ones...1111
One funny thing about Mersenne primes is that, as a result of what you describe, they are exactly those primes whose binary representation consists of a prime number of ones!
The smallest Mersenne prime, three, is binary 11, while the next largest is seven (111), then 31 (11111), then 127 (1111111). The next candidate, 2047 (11111111111), is not prime.
The smallest Mersenne prime, three, is binary 11, while the next largest is seven (111), then 31 (11111), then 127 (1111111). The next candidate, 2047 (11111111111), is not prime.
Shifting an integer left `n` bits is equivalent to multiplying it by `2 ** n`
Sounds like a new possible attack vector?
[deleted]