Commit Graph

709 Commits

Author SHA1 Message Date
Josh Stone 98cb815183 bigint: bump to 0.1.41
- Now uses Toom-3 multiplication for large inputs.
- `BigInt`/`BigUint` parsing now accepts `_` separating digits.
- `BigInt`/`BigUint::assign_from_slice` reinitializes the value, keeping
  the same internal buffer.
- `BigUint` now implements many `*Assign` ops.
- `BigUint::modpow(exp, mod)` performs efficient modular exponentiation.
2017-12-01 13:15:22 -08:00
Josh Stone 18b48f335e complex: bump to 0.1.41
`Complex` now implements `Num`, `Rem`, and `RemAssign`.

(Complex remainders don't have a clear mathematical basis, but we choose
to round toward zero to a gaussian integer.)
2017-12-01 13:02:13 -08:00
Josh Stone 0e1c4c8b65 traits: bump to 0.1.41
minor warning fixes
2017-12-01 12:54:48 -08:00
bors[bot] 0e31f3c6b3 Merge #345
345: Downgrade libc for Rust 1.8 CI r=cuviper a=cuviper
2017-12-01 01:30:41 +00:00
Josh Stone a7464b2b42 Roll back libc in the ci scripts too 2017-11-30 17:01:09 -08:00
Josh Stone d354559365 Downgrade libc for Rust 1.8 CI 2017-11-30 16:15:45 -08:00
Josh Stone cc3be86781 rational: bump to 0.1.40 2017-11-08 14:40:10 -08:00
bors[bot] ca7e438d77 Merge #342
342: rational: check for NaN when approximating floats r=cuviper a=cuviper

We had a test for NaN already, but thanks to undefined casts (#119) it
was only passing by luck -- on armv7hl it failed:

https://bugzilla.redhat.com/show_bug.cgi?id=1511187

Now we check for NaN explicitly.
2017-11-08 22:29:38 +00:00
Josh Stone b67f1bd6d6 rational: check for NaN when approximating floats
We had a test for NaN already, but thanks to undefined casts (#119) it
was only passing by luck -- on armv7hl it failed:

     https://bugzilla.redhat.com/show_bug.cgi?id=1511187

Now we check for NaN explicitly.
2017-11-08 14:09:05 -08:00
bors[bot] a203e9f9fc Merge #339
339: Implement modpow() for BigUint backed by Montgomery Multiplication r=cuviper a=str4d

Based on this Gist: https://gist.github.com/yshui/027eecdf95248ea69606

Also adds support to `BigUint.from_str_radix()` for using `_` as a visual separator.

Closes #136
2017-11-02 19:37:52 +00:00
Josh Stone ed10d617b5 bigint: Add a modpow fallback for even modulus 2017-10-22 16:44:05 -07:00
Josh Stone 35b7187e83 bigint::monty: use infallible conversions in tests 2017-10-22 15:49:51 -07:00
Josh Stone bb0c9324b2 bigint::monty: deduplicate mr.n and mr.p 2017-10-22 15:45:01 -07:00
Josh Stone b380880ed3 bigint::monty: simplify modpow zero test 2017-10-22 15:38:50 -07:00
Josh Stone 96c4a26624 bigint::monty: simplify modpow parameter init 2017-10-22 15:37:48 -07:00
Josh Stone 7fa27b6007 bigint::monty: simplify redc return value 2017-10-22 15:36:33 -07:00
Josh Stone 5708db0f67 bigint::monty: simplify redc masks 2017-10-22 15:34:46 -07:00
Josh Stone 5a0de140c9 bigint::monty: use mac_digit 2017-10-22 15:30:17 -07:00
Josh Stone 4d35815426 bigint::monty: simplify work space allocation 2017-10-22 15:28:59 -07:00
Josh Stone aea5f85216 bigint::monty: store the inverse as u32 2017-10-22 15:15:02 -07:00
Josh Stone c2fba06787 bigint: less pub in monty 2017-10-22 15:05:16 -07:00
Josh Stone 2a1fe6e7ef bigint: fix parsing leading _ and test more 2017-10-22 14:57:52 -07:00
bors[bot] fc39e1beaa Merge #340
340: Fix documentation formatting with commonmark enabled r=cuviper a=mbrubeck

This makes formatting correct with the new pulldown-cmark Markdown parser (rust-lang/rust#44229).
2017-10-22 21:12:28 +00:00
Matt Brubeck 531c2a754f Fix documentation formatting with commonmark enabled
This makes formatting correct with the new pulldown-cmark Markdown
parser (rust-lang/rust#44229).
2017-10-17 10:16:01 -07:00
str4d 720893f67b
Add support to BigUint.from_str_radix() for using _ as a visual separator 2017-10-09 16:11:18 +01:00
str4d f523b9c359
Implement modpow() for BigUint backed by Montgomery Multiplication
Based on this Gist: https://gist.github.com/yshui/027eecdf95248ea69606

Closes #136
2017-10-09 16:09:49 +01:00
bors[bot] 741a5a6207 Merge #335
335: Clean up some warnings r=cuviper a=cuviper
2017-09-22 00:38:06 +00:00
Josh Stone 2f8f952d1d clean up unused macros 2017-09-21 17:36:21 -07:00
Josh Stone 2a9750ada4 bigint: remove an unused mut 2017-09-21 17:28:37 -07:00
Josh Stone 7679cb86fb Remove `#[must_use]` on `__add2`
It doesn't actually work on functions yet, and nightly now warns that it
is experimental, behind `#[feature(fn_must_use)]`.
2017-09-21 17:26:20 -07:00
bors[bot] 4896746fec Merge #328
328: Optimizing BigUint and Bigint multiplication with the Toom-3 algorithm r=cuviper a=kompass

Hi !

I finally implemented the Toom-3 algorithm ! I first tried to minimize the memory allocations by allocating the `Vec<BigDigit>` myself, as was done for Toom-2, but Toom-3 needs more complex calculations, with negative numbers. So I gave up this method, to use `BigInt` directly, and it's already faster ! I also chose a better threshold for the Toom-2 algorithm.

Before any modification :
```
running 4 tests
test multiply_0        ... bench:         257 ns/iter (+/- 25)
test multiply_1        ... bench:      30,240 ns/iter (+/- 1,651)
test multiply_2        ... bench:   2,752,360 ns/iter (+/- 52,102)
test multiply_3        ... bench:  11,618,575 ns/iter (+/- 266,286)
```

With a better Toom-2 threshold (16 instead of 4) :
```
running 4 tests
test multiply_0        ... bench:         130 ns/iter (+/- 8)
test multiply_1        ... bench:      19,772 ns/iter (+/- 1,083)
test multiply_2        ... bench:   1,340,644 ns/iter (+/- 17,987)
test multiply_3        ... bench:   7,302,854 ns/iter (+/- 82,060)
```

With the Toom-3 algorithm (with a threshold of 300):
```
running 4 tests
test multiply_0        ... bench:         123 ns/iter (+/- 3)
test multiply_1        ... bench:      19,689 ns/iter (+/- 837)
test multiply_2        ... bench:   1,189,589 ns/iter (+/- 29,101)
test multiply_3        ... bench:   3,014,225 ns/iter (+/- 61,222)
```

I think this could be optimized, but it's a first step !
2017-09-20 20:53:40 +00:00
Josh Stone 1ddbee7f37 bigint mac3: tweak thresholds between algorithms
It's not too rigorous, but thresholds 32 and 256 give me better results.

Before:

     test multiply_0        ... bench:          87 ns/iter (+/- 0)
     test multiply_1        ... bench:      11,926 ns/iter (+/- 19)
     test multiply_2        ... bench:     772,178 ns/iter (+/- 3,068)
     test multiply_3        ... bench:   2,034,237 ns/iter (+/- 9,618)

After:

     test multiply_0        ... bench:          87 ns/iter (+/- 0)
     test multiply_1        ... bench:      11,927 ns/iter (+/- 64)
     test multiply_2        ... bench:     672,440 ns/iter (+/- 3,570)
     test multiply_3        ... bench:   1,577,065 ns/iter (+/- 11,137)
2017-09-20 13:19:00 -07:00
Josh Stone 28d84ca3ac Toom-3: operate more on values where possible 2017-09-20 13:17:06 -07:00
Josh Stone 2c2e46c8df Add comments about multiplication strategy 2017-09-20 13:15:44 -07:00
Josh Stone 05dc87c041 Improve mac_digit bounds checking
By starting with `split_at_mut`, the hot multiplication loop runs with
no bounds checking at all!  The remaining carry loop has a slightly
simpler check for when the remaining iterator runs dry.
2017-09-20 11:41:59 -07:00
bors[bot] 8646be5a95 Merge #330
330: Implement *Assign for BigUint r=cuviper a=Darksonn

Not only does this change increase convenience of use, it also allows adding a `&BigUint` to a `&mut BigUint` without allocating (if not necessary) or tricks such as:

    fn add(a: &mut BigUint, b: &BigUint) {
        let aa = mem::replace(a, BigUint::from_slice(&[])); // BigUint::from_slice(&[]) does not allocate
        *a = aa + b;
    }

With this change:

    fn add(a: &mut BigUint, b: &BigUint) {
        *a += b;
    }

It would make sense to add the same functionality to `BigInt`, but it uses some macros to handle the signs, and I'm not sure how to change the macros in order to perform this change.
2017-09-20 01:11:28 +00:00
Josh Stone 3c1c84307c bigint: make sure bigand is normalized 2017-09-19 17:53:13 -07:00
Josh Stone 952dba4e06 remove unused lifetime from forward_val_assign 2017-09-19 17:36:17 -07:00
bors[bot] 85bd97fcfe Merge #327
327: Add general Rem and Num implementations for Complex<T> r=cuviper a=carrutstick

This should address #209 with eyes towards addressing #321.

It was a little tricky to get `Rem` working for a general `Num`, and I had to add a `PartialOrd` constraint to get it working, but I think it should be fairly robust.

I could probably use extra eyes on the `from_str_radix` function, as I mostly lifted the code from the `from_str` function and I may be missing some subtleties in how that works.
2017-09-19 23:55:32 +00:00
Josh Stone 3adce78385 macros: bump to 0.1.37 2017-09-19 16:28:23 -07:00
Josh Stone ec0342e9f1 macros: add ast::Arm beginning_vert 2017-09-19 16:27:02 -07:00
Josh Stone 953087fe4e Fix biguint assert_assign_op for rust 1.8
The `$op` only seems to be accepted when used indirectly through another
macro, in this case `assert_eq`.  How nice.
2017-09-19 14:00:51 -07:00
Josh Stone 98a3f17db6 Fix impl_rem_assign_scalar for rust 1.8 2017-09-19 13:47:59 -07:00
Isaac Carruthers b29c13e54f Remove unnecessary PartialOrd constraint on new Rem implementation. 2017-09-11 17:13:01 -04:00
Alice Ryhl ff8f106186 Test *Assign for BigUint 2017-09-03 10:44:17 +02:00
Alice Ryhl 555dab7d33 Implement ShrAssign and ShlAssign for BigUint 2017-09-03 09:56:29 +02:00
Alice Ryhl 2f6c0bf354 Implement BitXorAssign for BigUint 2017-09-03 09:53:33 +02:00
Alice Ryhl 8c3b2de11c Implement BitAndAssign and BitOrAssign for BigUint 2017-09-02 23:37:54 +02:00
Alice Ryhl 23085800e0 Implement RemAssign for BigUint 2017-09-02 23:29:34 +02:00
Alice Ryhl e85ab24567 Forward by-value biguint and scalars to {Add,Mul,Sub,Div}Assign 2017-09-02 22:38:12 +02:00