mirror of
https://github.com/lcn2/calc.git
synced 2025-08-22 01:23:28 +03:00
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
4f86703843 | ||
|
07d8bf0f3e | ||
|
b4cd692bae | ||
|
83c898cc2b | ||
|
c585d7aa78 |
25
CHANGES
25
CHANGES
@@ -1,4 +1,27 @@
|
||||
The following are the changes from calc version 2.12.6.1 to date:
|
||||
The following are the changes from calc version 2.12.6.6 to date:
|
||||
|
||||
For historical purposes, in lucas.cal, gen_v1(1, n) always returns 4.
|
||||
|
||||
Fixed some compiler warnings, thanks to a report by Mike
|
||||
<michael dot d dot ince at gmail dot com>.
|
||||
|
||||
Added work around for a gcc warning bug, thanks to a report by Mike
|
||||
<michael dot d dot ince at gmail dot com>.
|
||||
|
||||
|
||||
The following are the changes from calc version 2.12.6.4 to 2.12.6.5:
|
||||
|
||||
Fixed warning about undefined operations involving the qlink(q)
|
||||
macro by replacing that macro with an inline-function. Thanks goes
|
||||
to David Haller <dnh at opensuse dot org> for this fix.
|
||||
|
||||
NOTE for Windows 10 users: Pavel Nemec <pane at seznam dot cz>
|
||||
reported that calc version 2.12.6.4 has been successfully
|
||||
compiled, installed and running on Windows 10. See README.WINDOWS
|
||||
for more details.
|
||||
|
||||
|
||||
The following are the changes from calc version 2.12.6.1 to 2.12.6.3:
|
||||
|
||||
Improved gen_v1(h,n) in lucas.cal to use an even faster search method.
|
||||
|
||||
|
@@ -1054,7 +1054,7 @@ EXT=
|
||||
|
||||
# The default calc versions
|
||||
#
|
||||
VERSION= 2.12.6.4
|
||||
VERSION= 2.12.6.6
|
||||
|
||||
# Names of shared libraries with versions
|
||||
#
|
||||
|
@@ -10,6 +10,21 @@ NOTE: The main developers do not have access to a Windoz based platform.
|
||||
Of course you are welcome to send us any patches that fix your
|
||||
Windoz build environment.
|
||||
|
||||
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
=-= compiling with Windows Subsystem for Linux (WSL) =-Cygwin =-=
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
It has been reported that calc version 2.12.6.4 has been successfully
|
||||
compiled, installed and running on Windows 10 on 2018 Jan 21.
|
||||
|
||||
We were told:
|
||||
|
||||
"The Windows Subsystem for Linux (WSL) is a new Windows 10 feature that
|
||||
enables you to run native Linux command-line tools directly on Windows"
|
||||
|
||||
https://docs.microsoft.com/cs-cz/windows/wsl/about
|
||||
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
=-= compiling with Cygwin =-=
|
||||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* lucas - perform a Lucas primality test on h*2^n-1
|
||||
*
|
||||
* Copyright (C) 1999,2017 Landon Curt Noll
|
||||
* Copyright (C) 1999,2017,2018 Landon Curt Noll
|
||||
*
|
||||
* Calc is open software; you can redistribute it and/or modify it under
|
||||
* the terms of the version 2.1 of the GNU Lesser General Public License
|
||||
@@ -373,41 +373,53 @@ lucas(h, n)
|
||||
return 1; /* 239 is prime */
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify that h*2^n-1 is not a multiple of 3
|
||||
*
|
||||
* The case for h*2^n-1 == 3 is handled above.
|
||||
*/
|
||||
if (((h % 3 == 1) && (n % 2 == 0)) || ((h % 3 == 2) && (n % 2 == 1))) {
|
||||
/* no need to test h*2^n-1, it is a multiple of 3 */
|
||||
ldebug("lucas","not-prime: != 3 and is a multiple of 3");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Avoid any numbers divisible by small primes
|
||||
*/
|
||||
/*
|
||||
* check for 3 <= prime factors < 29
|
||||
* pfact(28)/2 = 111546435
|
||||
* check for 5 <= prime factors < 31
|
||||
* pfact(30)/6 = 1078282205
|
||||
*/
|
||||
testval = h*2^n - 1;
|
||||
if (gcd(testval, 111546435) > 1) {
|
||||
/* a small 3 <= prime < 29 divides h*2^n-1 */
|
||||
ldebug("lucas","not-prime: 3<=prime<29 divides h*2^n-1");
|
||||
if (gcd(testval, 1078282205) > 1) {
|
||||
/* a small 5 <= prime < 31 divides h*2^n-1 */
|
||||
ldebug("lucas",\
|
||||
"not-prime: a small 5<=prime<31 divides h*2^n-1");
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* check for 29 <= prime factors < 47
|
||||
* pfact(46)/pfact(28) = 5864229
|
||||
* check for 31 <= prime factors < 53
|
||||
* pfact(52)/pfact(30) = 95041567
|
||||
*/
|
||||
if (gcd(testval, 58642669) > 1) {
|
||||
/* a small 29 <= prime < 47 divides h*2^n-1 */
|
||||
ldebug("lucas","not-prime: 29<=prime<47 divides h*2^n-1");
|
||||
if (gcd(testval, 95041567) > 1) {
|
||||
/* a small 31 <= prime < 53 divides h*2^n-1 */
|
||||
ldebug("lucas","not-prime: 31<=prime<53 divides h*2^n-1");
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* check for prime 47 <= factors < 257, if h*2^n-1 is large
|
||||
* 2^282 > pfact(256)/pfact(46) > 2^281
|
||||
* check for prime 53 <= factors < 257, if h*2^n-1 is large
|
||||
* 2^276 > pfact(256)/pfact(52) > 2^275
|
||||
*/
|
||||
bits = highbit(testval);
|
||||
if (bits >= 281) {
|
||||
if (bits >= 275) {
|
||||
if (pprod256 <= 0) {
|
||||
pprod256 = pfact(256)/pfact(46);
|
||||
pprod256 = pfact(256)/pfact(52);
|
||||
}
|
||||
if (gcd(testval, pprod256) > 1) {
|
||||
/* a small 47 <= prime < 257 divides h*2^n-1 */
|
||||
/* a small 53 <= prime < 257 divides h*2^n-1 */
|
||||
ldebug("lucas",\
|
||||
"not-prime: 47<=prime<257 divides h*2^n-1");
|
||||
"not-prime: 53<=prime<257 divides h*2^n-1");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -423,7 +435,9 @@ lucas(h, n)
|
||||
* generate a test for h*2^n-1. The legacy function,
|
||||
* legacy_gen_v1() used by the Amdahl 6 could have returned
|
||||
* -1. The new gen_v1() based on the method outlined in Ref4
|
||||
* will never return -1.
|
||||
* will never return -1 if h*2^n-1 is not a multiple of 3.
|
||||
* Because the "multiple of 3" case is handled above, the
|
||||
* call below to gen_v1() will never return -1.
|
||||
*/
|
||||
v1 = gen_v1(h, n);
|
||||
if (v1 < 0) {
|
||||
@@ -1172,6 +1186,26 @@ gen_v1(h, n)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Common Mersenne number case:
|
||||
*
|
||||
* For Mersenne numbers:
|
||||
*
|
||||
* 2^n-1
|
||||
*
|
||||
* we can use, 40% of the time, v(1) == 3. However nearly all code that
|
||||
* implements the Lucas-Lehmer test uses v(1) == 4. Whenever for
|
||||
* h != 0 mod 3, and particular the Mersenne number case of when h == 1:
|
||||
*
|
||||
* 1*2^n-1
|
||||
*
|
||||
* v(1) == 4 always works. For this reason, we return 4 when h == 1.
|
||||
*/
|
||||
if (h == 1) {
|
||||
/* v(1) == 4 always works for the Mersenne number case */
|
||||
return 4;
|
||||
}
|
||||
|
||||
/*
|
||||
* check for Case 1: (h mod 3 != 0)
|
||||
*/
|
||||
|
17
calc.c
17
calc.c
@@ -104,6 +104,8 @@ main(int argc, char **argv)
|
||||
int c; /* option */
|
||||
int index;
|
||||
int maxindex;
|
||||
/* fix gcc warning bug */
|
||||
int unusedint = 0;
|
||||
char *cp;
|
||||
char *endcp;
|
||||
char *bp;
|
||||
@@ -278,7 +280,9 @@ main(int argc, char **argv)
|
||||
exit(6);
|
||||
}
|
||||
calc_debug = cp;
|
||||
(void) strtol(cp, &endcp, 10);
|
||||
/* fix gcc warning bug */
|
||||
unusedint =
|
||||
strtol(cp, &endcp, 10);
|
||||
cp = endcp;
|
||||
if (*cp != '\0' &&
|
||||
*cp != ' ' && *cp != ':') {
|
||||
@@ -310,7 +314,9 @@ main(int argc, char **argv)
|
||||
exit(9);
|
||||
}
|
||||
resource_debug = cp;
|
||||
(void) strtol(cp, &endcp, 10);
|
||||
/* fix gcc warning bug */
|
||||
unusedint =
|
||||
strtol(cp, &endcp, 10);
|
||||
cp = endcp;
|
||||
if (*cp != '\0' &&
|
||||
*cp != ' ' && *cp != ':') {
|
||||
@@ -340,7 +346,8 @@ main(int argc, char **argv)
|
||||
exit(12);
|
||||
}
|
||||
user_debug = cp;
|
||||
(void) strtol(cp, &endcp, 10);
|
||||
/* unusedint avoids gcc warning bug */
|
||||
unusedint = strtol(cp, &endcp, 10);
|
||||
cp = endcp;
|
||||
if (*cp != '\0' && *cp != ' ') {
|
||||
fprintf(stderr, "Bad syntax in"
|
||||
@@ -721,8 +728,10 @@ main(int argc, char **argv)
|
||||
printf("main: run_state = %s\n", run_state_name(run_state));
|
||||
|
||||
/*
|
||||
* all done
|
||||
* All done! - Jessica Noll, Age 2
|
||||
*/
|
||||
/* fix gcc warning bug */
|
||||
unusedint++;
|
||||
libcalc_call_me_last();
|
||||
return (run_state == RUN_EXIT_WITH_ERROR ||
|
||||
run_state == RUN_ZERO) ? 1 : 0;
|
||||
|
@@ -348,7 +348,7 @@ EXT=
|
||||
|
||||
# The default calc versions
|
||||
#
|
||||
VERSION= 2.12.6.4
|
||||
VERSION= 2.12.6.6
|
||||
|
||||
# Names of shared libraries with versions
|
||||
#
|
||||
|
@@ -348,7 +348,7 @@ EXT=
|
||||
|
||||
# The default calc versions
|
||||
#
|
||||
VERSION= 2.12.6.4
|
||||
VERSION= 2.12.6.6
|
||||
|
||||
# Names of shared libraries with versions
|
||||
#
|
||||
|
4
qmath.h
4
qmath.h
@@ -254,7 +254,9 @@ E_FUNC NUMBER *swap_HALF_in_NUMBER(NUMBER *dest, NUMBER *src, BOOL all);
|
||||
#define qhighbit(q) (zhighbit((q)->num))
|
||||
#define qlowbit(q) (zlowbit((q)->num))
|
||||
#define qdivcount(q1, q2) (zdivcount((q1)->num, (q2)->num))
|
||||
#define qlink(q) ((q)->links++, (q))
|
||||
/* operation on #q may be undefined, so replace with an inline-function */
|
||||
/* was: #define qlink(q) ((q)->links++, (q)) */
|
||||
static inline NUMBER* qlink(NUMBER* q) { if(q) { (q)->links++; } return q; }
|
||||
|
||||
#define qfree(q) {if (--((q)->links) <= 0) qfreenum(q);}
|
||||
|
||||
|
2
value.c
2
value.c
@@ -2944,7 +2944,7 @@ printestr(VALUE *vp)
|
||||
bp = vp->v_nblock->blk;
|
||||
}
|
||||
i = bp->datalen;
|
||||
math_fmt("%ld,%d)", i, bp->blkchunk);
|
||||
math_fmt("%ld,%d)", i, (int) bp->blkchunk);
|
||||
cp = bp->data;
|
||||
if (i > 0) {
|
||||
math_str("={");
|
||||
|
@@ -45,7 +45,7 @@ static char *program;
|
||||
#define MAJOR_VER 2 /* major library version */
|
||||
#define MINOR_VER 12 /* minor library version */
|
||||
#define MAJOR_PATCH 6 /* major software level under library version */
|
||||
#define MINOR_PATCH 4 /* minor software level or 0 if not patched */
|
||||
#define MINOR_PATCH 6 /* minor software level or 0 if not patched */
|
||||
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user