From braintwo at gmail.com Sat Aug 29 08:24:57 2020 From: braintwo at gmail.com (Seth Troisi) Date: Sat, 29 Aug 2020 01:24:57 -0700 Subject: mpz_prevprime In-Reply-To: References: <69466e3f87f9aa06cdbf61063c5e8dd6.squirrel@student-web1.dm.unipi.it> <0e32e0f4c221588433931eb51090608b.squirrel@student-web1.dm.unipi.it> <5386c6153faca0ac37c237e7463e7f01@student.dm.unipi.it> <801c8e8a34e1439093c5b1e2a70e39a9@student.dm.unipi.it> <86zhe5cbcw.fsf@shell.gmplib.org> <52269b7fa33ab64b27a7d699ea498985@student.dm.unipi.it> <7f9877b1ef2744cba8784382c612b9b4.squirrel@student-web1.dm.unipi.it> <26ef33751830cb8c3873a34e9a7df28f@student.dm.unipi.it> <4db03d5d9cce5306d58455075def252a@student.dm.unipi.it> <9ef7b55d02d0a2a9afcda954c230441e@student.dm.unipi.it> <1b5861440ce878f2edb15f8e5ca4e4ab@student.dm.unipi.it> <16c3bb70ea21e6ac6db9892a5f58e844@student.dm.unipi.it> <6f97f40ab693e2eff36f25a71e19fdd1@student.dm.unipi.it> <74511411307e0668ebe60b6073ffce12@student.dm.unipi.it> <8f8df773e4cbbffbb1943f9ef1a76c63@student.dm.unipi.it> Message-ID: I made a few improvements. tested with '--enable-assert' and verified no impact to timing with `./tune/speed -f 1.02 -s 10-260 mpz_prevprime -p100000000 -P time_prevprime` comparing with mpz_nextprime (before and after my change) On Fri, Mar 27, 2020 at 2:29 AM Seth Troisi wrote: > Thanks for the quick review and probing comments. > > On Thu, Mar 26, 2020 at 2:00 PM Marco Bodrato > wrote: > >> Ciao, >> >> Il 2020-03-25 02:25 Seth Troisi ha scritto: >> > I'm back with a new mpz_prevprime patch >> >> diff -r 805304ca965a doc/gmp.texi >> + at deftypefun int mpz_prevprime (mpz_t @var{rop}, const mpz_t @var{op}) >> >> +If previous prime doesn't exist (e.g. @var{op} < 3), rop is unchanged >> and >> +0 is returned. >> >> I suggest "i.e." instead of "e.g.". >> > Replaced > >> >> diff -r 805304ca965a mpz/nextprime.c >> +findnext_small (unsigned t, short diff) >> [...] >> + ASSERT (t > 0 || (diff < 0 && t > 2)); >> >> This is equivalent to (t > 0). Do you mean (t > 2 || (diff > 0 && t > >> 0))? >> > Yes. changed now. > >> >> + t = diff > 0 ? ((t + 1) | (t > 1)) : >> + ((t == 3) ? 2 : ((t - 2) | 1)); >> >> Maybe move this to the caller side? Or partially, leaving here just >> ASSERT (t >= 2); >> t |= (t != 2); >> > I moved this to the caller side (so that both findnext and findnext_small > consider p) and added some comments > >> >> -void >> -mpz_nextprime (mpz_ptr p, mpz_srcptr n) >> +int >> +findnext (mpz_ptr p, >> >> If the function is not public any more, use static. >> > Done. > >> >> - mpz_setbit (p, 0); >> >> This line can still be here, maybe converted to >> * PTR (p) |= 1; >> > This has been moved to the outer functions. > Maybe I should add a test that p is odd? > Something like ASSERT (PTR(p) & 1 == 0); > > >> + /* smaller numbers handled earlier*/ >> + ASSERT (nbits >= 15); >> >> Not needed. Maybe ASSERT (nbits > 3), because we don't want to handle >> very small numbers with this code. >> > Changed back to nbits > 3 and added an ASSERT (SIZ(p) > 0); > >> >> +int >> +mpz_prevprime (mpz_ptr p, mpz_srcptr n) >> +{ >> + /* First handle tiny numbers */ >> + if (mpz_cmp_ui (n, 2) <= 0) >> + return 0; >> + >> + if (mpz_cmp_ui (n, NP_SMALL_LIMIT) < 0) >> + { >> + ASSERT (NP_SMALL_LIMIT < UINT_MAX); >> + mpz_set_ui (p, findnext_small (SIZ (n) > 0 ? mpz_get_ui (n) : 1, >> -2)); >> + return 2; >> + } >> >> The line "if (mpz_cmp_ui (n, 2) <= 0)" already handle the case (SIZ (n) >> <= 0), checking if (SIZ (n) > 0) is a nonsense >> Anyway... assume that code is used: what happens if findnext_small(1,-2) >> is called? >> > This has been reworked but should never have been included. > >> >> diff -r 805304ca965a tests/mpz/t-nextprime.c >> [...] >> +refmpz_prevprime (mpz_ptr p, mpz_srcptr t) >> [...] >> + if (mpz_cmp_ui(t, 3) <= 0) >> >> The loop after that branch handles also that case, don't it? >> > Yes, I was counting by two but I reverted that at some point. > >> >> >> test_largegaps () >> { >> [...] >> + mpz_set_ui (n, 3842610773); >> [...] >> + mpz_set_ui (n, 18361375334787046697UL); >> >> Those lines can fail at compile time... if 3842610773 does not fit in an >> int and 18361375334787046697 not in an unsigned long. E.g. when >> sizeof(int)==4. >> Use _set_str. >> >> + mpz_mul_ui (n, n, 4280516017); >> [...] >> + mpz_mul_ui (n, n, 3483347771); >> >> ... >> >> > I also added large negative tests for mpz_nextprime >> >> To be honest... I do not like this (undocumented) detail of the current >> behaviour of _nextprime. I personally do not like the idea to enforce it >> with a test... >> >> > and we can enable test_largegaps now that the default gap is smaller >> >> Yes, we should. >> I would also check many gaps around 2^{16n}, to check if everything >> works correctly when the search crosses the limb boundaries. >> Maybe structuring the test with a table {"number(base16?)", gap}, i.e. >> with (also) something like: >> {"65521", 16}, >> {"4294967291", 20}, >> {"281474976710597", 80}, >> {"18446744073709551557", 72}, >> {"1208925819614629174706111", 78}, >> {"79228162514264337593543950319", 78}, >> {"5192296858534827628530496329220021", 100}, >> {"340282366920938463463374607431768211297", 210}, >> > I did this (using hex form) I threw in some 16*n-1 also > >> >> >> +void >> +test_prevprime (gmp_randstate_ptr rands, int reps) >> [...] >> + /* Test mpz_prevprime(3 <= n < 2^45) returns 2. */ >> [...] >> + /* Test mpz_prevprime(n > 2^70) returns 1. */ >> [...] >> + if ( retval != 1 ) >> [...] >> >> I do not understand. A test-function should fail if a function behaviour >> does not agree with the documented interface, or it can fail for some >> other kind of regression that we want to avoid... >> Your test will warn us against possible improvements! What if the future >> primality testing functions will return 2 on some large primes? >> > > I modified the tests so that it makes it more clean that it's testing that > it verifies the retval matches > the return of mpz_prob_prime. > > >> Ok, I'm sleepy now. I hope I did not write wrong things. Good night! >> > Given the number of times you are pointing our real issues, I wouldn't be > worried about writing one or two wrong comments :) > >> >> ?is, >> m > > -------------- next part -------------- A non-text attachment was scrubbed... Name: prev_prime_0829.patch Type: text/x-patch Size: 16228 bytes Desc: not available URL: