>> error fixed + test with a python impl
This commit is contained in:
1 parent
b7f596588d
commit
69a48bc711
5 files changed
+36
-5
No files matched your search
@@ -4,7 +4,7 @@
|
|||||||
# maturin generate-ci github
|
# maturin generate-ci github
|
||||||
#
|
#
|
||||||
name: CI
|
name: CI
|
||||||
|
# unexist rn
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
def fast2(n: int) -> int:
|
||||||
|
"port to python"
|
||||||
|
a, b = 0, 1
|
||||||
|
bit_len = n.bit_length()
|
||||||
|
mask = 0 if bit_len == 0 else 1 << (bit_len - 1)
|
||||||
|
while mask > 0:
|
||||||
|
c = a * (2 * b - a)
|
||||||
|
d = a * a + b * b
|
||||||
|
if n & mask == 0:
|
||||||
|
a, b = c, d
|
||||||
|
else:
|
||||||
|
a, b = d, c + d
|
||||||
|
mask >>= 1
|
||||||
|
return a
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
import timeit
|
||||||
|
import fib
|
||||||
|
import lda_module
|
||||||
|
import random
|
||||||
|
|
||||||
|
f = {"randint": random.randint}
|
||||||
|
g = "92"
|
||||||
|
# g = "randint(0, 92)"
|
||||||
|
print(g)
|
||||||
|
print(timeit.timeit(f"fast2({g})", globals=f | {"fast2": fib.fast2})) # 0.69
|
||||||
|
print(timeit.timeit(f"fib({g})", globals=f | {"fib": lda_module.fib})) # 0.31
|
||||||
+3
-4
@@ -5,20 +5,19 @@
|
|||||||
pub fn fast2(n: u64) -> u64 {
|
pub fn fast2(n: u64) -> u64 {
|
||||||
let (mut a, mut b) = (0, 1);
|
let (mut a, mut b) = (0, 1);
|
||||||
let m = n;
|
let m = n;
|
||||||
let mut mask = (u64::MAX >> (m.leading_zeros() + 1)) + 1;
|
let bit_len = u64::BITS - m.leading_zeros(); // copilot
|
||||||
|
let mut mask = if bit_len == 0 { 0 } else { 1 << (bit_len - 1) };
|
||||||
while mask > 0 {
|
while mask > 0 {
|
||||||
let c = a * (2 * b - a);
|
let c = a * (2 * b - a);
|
||||||
let d = a * a + b * b;
|
let d = a * a + b * b;
|
||||||
if m & mask == 0 {
|
if m & mask == 0 {
|
||||||
(a, b) = (c, d);
|
(a, b) = (c, d);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
(a, b) = (d, c + d);
|
(a, b) = (d, c + d);
|
||||||
}
|
}
|
||||||
mask >>= 1;
|
mask >>= 1;
|
||||||
}
|
}
|
||||||
a
|
a
|
||||||
|
|
||||||
}
|
}
|
||||||
// 0, 1, 3, 7
|
// 0, 1, 3, 7
|
||||||
// -> -1 /2 -1 /2 -1 /2
|
// -> -1 /2 -1 /2 -1 /2
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ pub mod pyexport {
|
|||||||
|
|
||||||
/// this shit is the thing now in python
|
/// this shit is the thing now in python
|
||||||
#[pyfunction]
|
#[pyfunction]
|
||||||
|
#[pyo3(signature = (n), text_signature = "(n: int) -> int")]
|
||||||
fn fib(n: u64) -> u64 {
|
fn fib(n: u64) -> u64 {
|
||||||
crate::fib::fast2(n)
|
crate::fib::fast2(n)
|
||||||
// currently use u64 as a large number tupe, can use num_bigint
|
// currently use u64 as a large number tupe, can use num_bigint
|
||||||
|
|||||||
Reference in new issue
Block a user