Initialisation du repository de Beta
This commit is contained in:
commit
14985f6dbb
9469 changed files with 1903273 additions and 0 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,134 @@
|
|||
from sympy.core.random import randint
|
||||
|
||||
from sympy.ntheory.bbp_pi import pi_hex_digits
|
||||
from sympy.testing.pytest import raises
|
||||
|
||||
|
||||
# http://www.herongyang.com/Cryptography/Blowfish-First-8366-Hex-Digits-of-PI.html
|
||||
# There are actually 8336 listed there; with the prepended 3 there are 8337
|
||||
# below
|
||||
dig=''.join('''
|
||||
3243f6a8885a308d313198a2e03707344a4093822299f31d0082efa98ec4e6c89452821e638d013
|
||||
77be5466cf34e90c6cc0ac29b7c97c50dd3f84d5b5b54709179216d5d98979fb1bd1310ba698dfb5
|
||||
ac2ffd72dbd01adfb7b8e1afed6a267e96ba7c9045f12c7f9924a19947b3916cf70801f2e2858efc
|
||||
16636920d871574e69a458fea3f4933d7e0d95748f728eb658718bcd5882154aee7b54a41dc25a59
|
||||
b59c30d5392af26013c5d1b023286085f0ca417918b8db38ef8e79dcb0603a180e6c9e0e8bb01e8a
|
||||
3ed71577c1bd314b2778af2fda55605c60e65525f3aa55ab945748986263e8144055ca396a2aab10
|
||||
b6b4cc5c341141e8cea15486af7c72e993b3ee1411636fbc2a2ba9c55d741831f6ce5c3e169b8793
|
||||
1eafd6ba336c24cf5c7a325381289586773b8f48986b4bb9afc4bfe81b6628219361d809ccfb21a9
|
||||
91487cac605dec8032ef845d5de98575b1dc262302eb651b8823893e81d396acc50f6d6ff383f442
|
||||
392e0b4482a484200469c8f04a9e1f9b5e21c66842f6e96c9a670c9c61abd388f06a51a0d2d8542f
|
||||
68960fa728ab5133a36eef0b6c137a3be4ba3bf0507efb2a98a1f1651d39af017666ca593e82430e
|
||||
888cee8619456f9fb47d84a5c33b8b5ebee06f75d885c12073401a449f56c16aa64ed3aa62363f77
|
||||
061bfedf72429b023d37d0d724d00a1248db0fead349f1c09b075372c980991b7b25d479d8f6e8de
|
||||
f7e3fe501ab6794c3b976ce0bd04c006bac1a94fb6409f60c45e5c9ec2196a246368fb6faf3e6c53
|
||||
b51339b2eb3b52ec6f6dfc511f9b30952ccc814544af5ebd09bee3d004de334afd660f2807192e4b
|
||||
b3c0cba85745c8740fd20b5f39b9d3fbdb5579c0bd1a60320ad6a100c6402c7279679f25fefb1fa3
|
||||
cc8ea5e9f8db3222f83c7516dffd616b152f501ec8ad0552ab323db5fafd23876053317b483e00df
|
||||
829e5c57bbca6f8ca01a87562edf1769dbd542a8f6287effc3ac6732c68c4f5573695b27b0bbca58
|
||||
c8e1ffa35db8f011a010fa3d98fd2183b84afcb56c2dd1d35b9a53e479b6f84565d28e49bc4bfb97
|
||||
90e1ddf2daa4cb7e3362fb1341cee4c6e8ef20cada36774c01d07e9efe2bf11fb495dbda4dae9091
|
||||
98eaad8e716b93d5a0d08ed1d0afc725e08e3c5b2f8e7594b78ff6e2fbf2122b648888b812900df0
|
||||
1c4fad5ea0688fc31cd1cff191b3a8c1ad2f2f2218be0e1777ea752dfe8b021fa1e5a0cc0fb56f74
|
||||
e818acf3d6ce89e299b4a84fe0fd13e0b77cc43b81d2ada8d9165fa2668095770593cc7314211a14
|
||||
77e6ad206577b5fa86c75442f5fb9d35cfebcdaf0c7b3e89a0d6411bd3ae1e7e4900250e2d2071b3
|
||||
5e226800bb57b8e0af2464369bf009b91e5563911d59dfa6aa78c14389d95a537f207d5ba202e5b9
|
||||
c5832603766295cfa911c819684e734a41b3472dca7b14a94a1b5100529a532915d60f573fbc9bc6
|
||||
e42b60a47681e6740008ba6fb5571be91ff296ec6b2a0dd915b6636521e7b9f9b6ff34052ec58556
|
||||
6453b02d5da99f8fa108ba47996e85076a4b7a70e9b5b32944db75092ec4192623ad6ea6b049a7df
|
||||
7d9cee60b88fedb266ecaa8c71699a17ff5664526cc2b19ee1193602a575094c29a0591340e4183a
|
||||
3e3f54989a5b429d656b8fe4d699f73fd6a1d29c07efe830f54d2d38e6f0255dc14cdd20868470eb
|
||||
266382e9c6021ecc5e09686b3f3ebaefc93c9718146b6a70a1687f358452a0e286b79c5305aa5007
|
||||
373e07841c7fdeae5c8e7d44ec5716f2b8b03ada37f0500c0df01c1f040200b3ffae0cf51a3cb574
|
||||
b225837a58dc0921bdd19113f97ca92ff69432477322f547013ae5e58137c2dadcc8b576349af3dd
|
||||
a7a94461460fd0030eecc8c73ea4751e41e238cd993bea0e2f3280bba1183eb3314e548b384f6db9
|
||||
086f420d03f60a04bf2cb8129024977c795679b072bcaf89afde9a771fd9930810b38bae12dccf3f
|
||||
2e5512721f2e6b7124501adde69f84cd877a5847187408da17bc9f9abce94b7d8cec7aec3adb851d
|
||||
fa63094366c464c3d2ef1c18473215d908dd433b3724c2ba1612a14d432a65c45150940002133ae4
|
||||
dd71dff89e10314e5581ac77d65f11199b043556f1d7a3c76b3c11183b5924a509f28fe6ed97f1fb
|
||||
fa9ebabf2c1e153c6e86e34570eae96fb1860e5e0a5a3e2ab3771fe71c4e3d06fa2965dcb999e71d
|
||||
0f803e89d65266c8252e4cc9789c10b36ac6150eba94e2ea78a5fc3c531e0a2df4f2f74ea7361d2b
|
||||
3d1939260f19c279605223a708f71312b6ebadfe6eeac31f66e3bc4595a67bc883b17f37d1018cff
|
||||
28c332ddefbe6c5aa56558218568ab9802eecea50fdb2f953b2aef7dad5b6e2f841521b628290761
|
||||
70ecdd4775619f151013cca830eb61bd960334fe1eaa0363cfb5735c904c70a239d59e9e0bcbaade
|
||||
14eecc86bc60622ca79cab5cabb2f3846e648b1eaf19bdf0caa02369b9655abb5040685a323c2ab4
|
||||
b3319ee9d5c021b8f79b540b19875fa09995f7997e623d7da8f837889a97e32d7711ed935f166812
|
||||
810e358829c7e61fd696dedfa17858ba9957f584a51b2272639b83c3ff1ac24696cdb30aeb532e30
|
||||
548fd948e46dbc312858ebf2ef34c6ffeafe28ed61ee7c3c735d4a14d9e864b7e342105d14203e13
|
||||
e045eee2b6a3aaabeadb6c4f15facb4fd0c742f442ef6abbb5654f3b1d41cd2105d81e799e86854d
|
||||
c7e44b476a3d816250cf62a1f25b8d2646fc8883a0c1c7b6a37f1524c369cb749247848a0b5692b2
|
||||
85095bbf00ad19489d1462b17423820e0058428d2a0c55f5ea1dadf43e233f70613372f0928d937e
|
||||
41d65fecf16c223bdb7cde3759cbee74604085f2a7ce77326ea607808419f8509ee8efd85561d997
|
||||
35a969a7aac50c06c25a04abfc800bcadc9e447a2ec3453484fdd567050e1e9ec9db73dbd3105588
|
||||
cd675fda79e3674340c5c43465713e38d83d28f89ef16dff20153e21e78fb03d4ae6e39f2bdb83ad
|
||||
f7e93d5a68948140f7f64c261c94692934411520f77602d4f7bcf46b2ed4a20068d40824713320f4
|
||||
6a43b7d4b7500061af1e39f62e9724454614214f74bf8b88404d95fc1d96b591af70f4ddd366a02f
|
||||
45bfbc09ec03bd97857fac6dd031cb850496eb27b355fd3941da2547e6abca0a9a28507825530429
|
||||
f40a2c86dae9b66dfb68dc1462d7486900680ec0a427a18dee4f3ffea2e887ad8cb58ce0067af4d6
|
||||
b6aace1e7cd3375fecce78a399406b2a4220fe9e35d9f385b9ee39d7ab3b124e8b1dc9faf74b6d18
|
||||
5626a36631eae397b23a6efa74dd5b43326841e7f7ca7820fbfb0af54ed8feb397454056acba4895
|
||||
2755533a3a20838d87fe6ba9b7d096954b55a867bca1159a58cca9296399e1db33a62a4a563f3125
|
||||
f95ef47e1c9029317cfdf8e80204272f7080bb155c05282ce395c11548e4c66d2248c1133fc70f86
|
||||
dc07f9c9ee41041f0f404779a45d886e17325f51ebd59bc0d1f2bcc18f41113564257b7834602a9c
|
||||
60dff8e8a31f636c1b0e12b4c202e1329eaf664fd1cad181156b2395e0333e92e13b240b62eebeb9
|
||||
2285b2a20ee6ba0d99de720c8c2da2f728d012784595b794fd647d0862e7ccf5f05449a36f877d48
|
||||
fac39dfd27f33e8d1e0a476341992eff743a6f6eabf4f8fd37a812dc60a1ebddf8991be14cdb6e6b
|
||||
0dc67b55106d672c372765d43bdcd0e804f1290dc7cc00ffa3b5390f92690fed0b667b9ffbcedb7d
|
||||
9ca091cf0bd9155ea3bb132f88515bad247b9479bf763bd6eb37392eb3cc1159798026e297f42e31
|
||||
2d6842ada7c66a2b3b12754ccc782ef11c6a124237b79251e706a1bbe64bfb63501a6b101811caed
|
||||
fa3d25bdd8e2e1c3c9444216590a121386d90cec6ed5abea2a64af674eda86a85fbebfe98864e4c3
|
||||
fe9dbc8057f0f7c08660787bf86003604dd1fd8346f6381fb07745ae04d736fccc83426b33f01eab
|
||||
71b08041873c005e5f77a057bebde8ae2455464299bf582e614e58f48ff2ddfda2f474ef388789bd
|
||||
c25366f9c3c8b38e74b475f25546fcd9b97aeb26618b1ddf84846a0e79915f95e2466e598e20b457
|
||||
708cd55591c902de4cb90bace1bb8205d011a862487574a99eb77f19b6e0a9dc09662d09a1c43246
|
||||
33e85a1f0209f0be8c4a99a0251d6efe101ab93d1d0ba5a4dfa186f20f2868f169dcb7da83573906
|
||||
fea1e2ce9b4fcd7f5250115e01a70683faa002b5c40de6d0279af88c27773f8641c3604c0661a806
|
||||
b5f0177a28c0f586e0006058aa30dc7d6211e69ed72338ea6353c2dd94c2c21634bbcbee5690bcb6
|
||||
deebfc7da1ce591d766f05e4094b7c018839720a3d7c927c2486e3725f724d9db91ac15bb4d39eb8
|
||||
fced54557808fca5b5d83d7cd34dad0fc41e50ef5eb161e6f8a28514d96c51133c6fd5c7e756e14e
|
||||
c4362abfceddc6c837d79a323492638212670efa8e406000e03a39ce37d3faf5cfabc277375ac52d
|
||||
1b5cb0679e4fa33742d382274099bc9bbed5118e9dbf0f7315d62d1c7ec700c47bb78c1b6b21a190
|
||||
45b26eb1be6a366eb45748ab2fbc946e79c6a376d26549c2c8530ff8ee468dde7dd5730a1d4cd04d
|
||||
c62939bbdba9ba4650ac9526e8be5ee304a1fad5f06a2d519a63ef8ce29a86ee22c089c2b843242e
|
||||
f6a51e03aa9cf2d0a483c061ba9be96a4d8fe51550ba645bd62826a2f9a73a3ae14ba99586ef5562
|
||||
e9c72fefd3f752f7da3f046f6977fa0a5980e4a91587b086019b09e6ad3b3ee593e990fd5a9e34d7
|
||||
972cf0b7d9022b8b5196d5ac3a017da67dd1cf3ed67c7d2d281f9f25cfadf2b89b5ad6b4725a88f5
|
||||
4ce029ac71e019a5e647b0acfded93fa9be8d3c48d283b57ccf8d5662979132e28785f0191ed7560
|
||||
55f7960e44e3d35e8c15056dd488f46dba03a161250564f0bdc3eb9e153c9057a297271aeca93a07
|
||||
2a1b3f6d9b1e6321f5f59c66fb26dcf3197533d928b155fdf5035634828aba3cbb28517711c20ad9
|
||||
f8abcc5167ccad925f4de817513830dc8e379d58629320f991ea7a90c2fb3e7bce5121ce64774fbe
|
||||
32a8b6e37ec3293d4648de53696413e680a2ae0810dd6db22469852dfd09072166b39a460a6445c0
|
||||
dd586cdecf1c20c8ae5bbef7dd1b588d40ccd2017f6bb4e3bbdda26a7e3a59ff453e350a44bcb4cd
|
||||
d572eacea8fa6484bb8d6612aebf3c6f47d29be463542f5d9eaec2771bf64e6370740e0d8de75b13
|
||||
57f8721671af537d5d4040cb084eb4e2cc34d2466a0115af84e1b0042895983a1d06b89fb4ce6ea0
|
||||
486f3f3b823520ab82011a1d4b277227f8611560b1e7933fdcbb3a792b344525bda08839e151ce79
|
||||
4b2f32c9b7a01fbac9e01cc87ebcc7d1f6cf0111c3a1e8aac71a908749d44fbd9ad0dadecbd50ada
|
||||
380339c32ac69136678df9317ce0b12b4ff79e59b743f5bb3af2d519ff27d9459cbf97222c15e6fc
|
||||
2a0f91fc719b941525fae59361ceb69cebc2a8645912baa8d1b6c1075ee3056a0c10d25065cb03a4
|
||||
42e0ec6e0e1698db3b4c98a0be3278e9649f1f9532e0d392dfd3a0342b8971f21e1b0a74414ba334
|
||||
8cc5be7120c37632d8df359f8d9b992f2ee60b6f470fe3f11de54cda541edad891ce6279cfcd3e7e
|
||||
6f1618b166fd2c1d05848fd2c5f6fb2299f523f357a632762393a8353156cccd02acf081625a75eb
|
||||
b56e16369788d273ccde96629281b949d04c50901b71c65614e6c6c7bd327a140a45e1d006c3f27b
|
||||
9ac9aa53fd62a80f00bb25bfe235bdd2f671126905b2040222b6cbcf7ccd769c2b53113ec01640e3
|
||||
d338abbd602547adf0ba38209cf746ce7677afa1c52075606085cbfe4e8ae88dd87aaaf9b04cf9aa
|
||||
7e1948c25c02fb8a8c01c36ae4d6ebe1f990d4f869a65cdea03f09252dc208e69fb74e6132ce77e2
|
||||
5b578fdfe33ac372e6'''.split())
|
||||
|
||||
|
||||
def test_hex_pi_nth_digits():
|
||||
assert pi_hex_digits(0) == '3243f6a8885a30'
|
||||
assert pi_hex_digits(1) == '243f6a8885a308'
|
||||
assert pi_hex_digits(10000) == '68ac8fcfb8016c'
|
||||
assert pi_hex_digits(13) == '08d313198a2e03'
|
||||
assert pi_hex_digits(0, 3) == '324'
|
||||
assert pi_hex_digits(0, 0) == ''
|
||||
raises(ValueError, lambda: pi_hex_digits(-1))
|
||||
raises(ValueError, lambda: pi_hex_digits(0, -1))
|
||||
raises(ValueError, lambda: pi_hex_digits(3.14))
|
||||
|
||||
# this will pick a random segment to compute every time
|
||||
# it is run. If it ever fails, there is an error in the
|
||||
# computation.
|
||||
n = randint(0, len(dig))
|
||||
prec = randint(0, len(dig) - n)
|
||||
assert pi_hex_digits(n, prec) == dig[n: n + prec]
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
import itertools
|
||||
from sympy.core import GoldenRatio as phi
|
||||
from sympy.core.numbers import (Rational, pi)
|
||||
from sympy.core.singleton import S
|
||||
from sympy.functions.elementary.miscellaneous import sqrt
|
||||
from sympy.ntheory.continued_fraction import \
|
||||
(continued_fraction_periodic as cf_p,
|
||||
continued_fraction_iterator as cf_i,
|
||||
continued_fraction_convergents as cf_c,
|
||||
continued_fraction_reduce as cf_r,
|
||||
continued_fraction as cf)
|
||||
from sympy.testing.pytest import raises
|
||||
|
||||
|
||||
def test_continued_fraction():
|
||||
assert cf_p(1, 1, 10, 0) == cf_p(1, 1, 0, 1)
|
||||
assert cf_p(1, -1, 10, 1) == cf_p(-1, 1, 10, -1)
|
||||
t = sqrt(2)
|
||||
assert cf((1 + t)*(1 - t)) == cf(-1)
|
||||
for n in [0, 2, Rational(2, 3), sqrt(2), 3*sqrt(2), 1 + 2*sqrt(3)/5,
|
||||
(2 - 3*sqrt(5))/7, 1 + sqrt(2), (-5 + sqrt(17))/4]:
|
||||
assert (cf_r(cf(n)) - n).expand() == 0
|
||||
assert (cf_r(cf(-n)) + n).expand() == 0
|
||||
raises(ValueError, lambda: cf(sqrt(2 + sqrt(3))))
|
||||
raises(ValueError, lambda: cf(sqrt(2) + sqrt(3)))
|
||||
raises(ValueError, lambda: cf(pi))
|
||||
raises(ValueError, lambda: cf(.1))
|
||||
|
||||
raises(ValueError, lambda: cf_p(1, 0, 0))
|
||||
raises(ValueError, lambda: cf_p(1, 1, -1))
|
||||
assert cf_p(4, 3, 0) == [1, 3]
|
||||
assert cf_p(0, 3, 5) == [0, 1, [2, 1, 12, 1, 2, 2]]
|
||||
assert cf_p(1, 1, 0) == [1]
|
||||
assert cf_p(3, 4, 0) == [0, 1, 3]
|
||||
assert cf_p(4, 5, 0) == [0, 1, 4]
|
||||
assert cf_p(5, 6, 0) == [0, 1, 5]
|
||||
assert cf_p(11, 13, 0) == [0, 1, 5, 2]
|
||||
assert cf_p(16, 19, 0) == [0, 1, 5, 3]
|
||||
assert cf_p(27, 32, 0) == [0, 1, 5, 2, 2]
|
||||
assert cf_p(1, 2, 5) == [[1]]
|
||||
assert cf_p(0, 1, 2) == [1, [2]]
|
||||
assert cf_p(6, 7, 49) == [1, 1, 6]
|
||||
assert cf_p(3796, 1387, 0) == [2, 1, 2, 1, 4]
|
||||
assert cf_p(3245, 10000) == [0, 3, 12, 4, 13]
|
||||
assert cf_p(1932, 2568) == [0, 1, 3, 26, 2]
|
||||
assert cf_p(6589, 2569) == [2, 1, 1, 3, 2, 1, 3, 1, 23]
|
||||
|
||||
def take(iterator, n=7):
|
||||
return list(itertools.islice(iterator, n))
|
||||
|
||||
assert take(cf_i(phi)) == [1, 1, 1, 1, 1, 1, 1]
|
||||
assert take(cf_i(pi)) == [3, 7, 15, 1, 292, 1, 1]
|
||||
|
||||
assert list(cf_i(Rational(17, 12))) == [1, 2, 2, 2]
|
||||
assert list(cf_i(Rational(-17, 12))) == [-2, 1, 1, 2, 2]
|
||||
|
||||
assert list(cf_c([1, 6, 1, 8])) == [S.One, Rational(7, 6), Rational(8, 7), Rational(71, 62)]
|
||||
assert list(cf_c([2])) == [S(2)]
|
||||
assert list(cf_c([1, 1, 1, 1, 1, 1, 1])) == [S.One, S(2), Rational(3, 2), Rational(5, 3),
|
||||
Rational(8, 5), Rational(13, 8), Rational(21, 13)]
|
||||
assert list(cf_c([1, 6, Rational(-1, 2), 4])) == [S.One, Rational(7, 6), Rational(5, 4), Rational(3, 2)]
|
||||
assert take(cf_c([[1]])) == [S.One, S(2), Rational(3, 2), Rational(5, 3), Rational(8, 5),
|
||||
Rational(13, 8), Rational(21, 13)]
|
||||
assert take(cf_c([1, [1, 2]])) == [S.One, S(2), Rational(5, 3), Rational(7, 4), Rational(19, 11),
|
||||
Rational(26, 15), Rational(71, 41)]
|
||||
|
||||
cf_iter_e = (2 if i == 1 else i // 3 * 2 if i % 3 == 0 else 1 for i in itertools.count(1))
|
||||
assert take(cf_c(cf_iter_e)) == [S(2), S(3), Rational(8, 3), Rational(11, 4), Rational(19, 7),
|
||||
Rational(87, 32), Rational(106, 39)]
|
||||
|
||||
assert cf_r([1, 6, 1, 8]) == Rational(71, 62)
|
||||
assert cf_r([3]) == S(3)
|
||||
assert cf_r([-1, 5, 1, 4]) == Rational(-24, 29)
|
||||
assert (cf_r([0, 1, 1, 7, [24, 8]]) - (sqrt(3) + 2)/7).expand() == 0
|
||||
assert cf_r([1, 5, 9]) == Rational(55, 46)
|
||||
assert (cf_r([[1]]) - (sqrt(5) + 1)/2).expand() == 0
|
||||
assert cf_r([-3, 1, 1, [2]]) == -1 - sqrt(2)
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
from sympy.ntheory import count_digits, digits, is_palindromic
|
||||
from sympy.core.intfunc import num_digits
|
||||
|
||||
from sympy.testing.pytest import raises
|
||||
|
||||
|
||||
def test_num_digits():
|
||||
# depending on whether one rounds up or down or uses log or log10,
|
||||
# one or more of these will fail if you don't check for the off-by
|
||||
# one condition
|
||||
assert num_digits(2, 2) == 2
|
||||
assert num_digits(2**48 - 1, 2) == 48
|
||||
assert num_digits(1000, 10) == 4
|
||||
assert num_digits(125, 5) == 4
|
||||
assert num_digits(100, 16) == 2
|
||||
assert num_digits(-1000, 10) == 4
|
||||
# if changes are made to the function, this structured test over
|
||||
# this range will expose problems
|
||||
for base in range(2, 100):
|
||||
for e in range(1, 100):
|
||||
n = base**e
|
||||
assert num_digits(n, base) == e + 1
|
||||
assert num_digits(n + 1, base) == e + 1
|
||||
assert num_digits(n - 1, base) == e
|
||||
|
||||
|
||||
def test_digits():
|
||||
assert all(digits(n, 2)[1:] == [int(d) for d in format(n, 'b')]
|
||||
for n in range(20))
|
||||
assert all(digits(n, 8)[1:] == [int(d) for d in format(n, 'o')]
|
||||
for n in range(20))
|
||||
assert all(digits(n, 16)[1:] == [int(d, 16) for d in format(n, 'x')]
|
||||
for n in range(20))
|
||||
assert digits(2345, 34) == [34, 2, 0, 33]
|
||||
assert digits(384753, 71) == [71, 1, 5, 23, 4]
|
||||
assert digits(93409, 10) == [10, 9, 3, 4, 0, 9]
|
||||
assert digits(-92838, 11) == [-11, 6, 3, 8, 2, 9]
|
||||
assert digits(35, 10) == [10, 3, 5]
|
||||
assert digits(35, 10, 3) == [10, 0, 3, 5]
|
||||
assert digits(-35, 10, 4) == [-10, 0, 0, 3, 5]
|
||||
raises(ValueError, lambda: digits(2, 2, 1))
|
||||
|
||||
|
||||
def test_count_digits():
|
||||
assert count_digits(55, 2) == {1: 5, 0: 1}
|
||||
assert count_digits(55, 10) == {5: 2}
|
||||
n = count_digits(123)
|
||||
assert n[4] == 0 and type(n[4]) is int
|
||||
|
||||
|
||||
def test_is_palindromic():
|
||||
assert is_palindromic(-11)
|
||||
assert is_palindromic(11)
|
||||
assert is_palindromic(0o121, 8)
|
||||
assert not is_palindromic(123)
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
from sympy.external.gmpy import invert
|
||||
from sympy.ntheory.ecm import ecm, Point
|
||||
from sympy.testing.pytest import slow
|
||||
|
||||
@slow
|
||||
def test_ecm():
|
||||
assert ecm(3146531246531241245132451321) == {3, 100327907731, 10454157497791297}
|
||||
assert ecm(46167045131415113) == {43, 2634823, 407485517}
|
||||
assert ecm(631211032315670776841) == {9312934919, 67777885039}
|
||||
assert ecm(398883434337287) == {99476569, 4009823}
|
||||
assert ecm(64211816600515193) == {281719, 359641, 633767}
|
||||
assert ecm(4269021180054189416198169786894227) == {184039, 241603, 333331, 477973, 618619, 974123}
|
||||
assert ecm(4516511326451341281684513) == {3, 39869, 131743543, 95542348571}
|
||||
assert ecm(4132846513818654136451) == {47, 160343, 2802377, 195692803}
|
||||
assert ecm(168541512131094651323) == {79, 113, 11011069, 1714635721}
|
||||
#This takes ~10secs while factorint is not able to factorize this even in ~10mins
|
||||
assert ecm(7060005655815754299976961394452809, B1=100000, B2=1000000) == {6988699669998001, 1010203040506070809}
|
||||
|
||||
|
||||
def test_Point():
|
||||
#The curve is of the form y**2 = x**3 + a*x**2 + x
|
||||
mod = 101
|
||||
a = 10
|
||||
a_24 = (a + 2)*invert(4, mod)
|
||||
p1 = Point(10, 17, a_24, mod)
|
||||
p2 = p1.double()
|
||||
assert p2 == Point(68, 56, a_24, mod)
|
||||
p4 = p2.double()
|
||||
assert p4 == Point(22, 64, a_24, mod)
|
||||
p8 = p4.double()
|
||||
assert p8 == Point(71, 95, a_24, mod)
|
||||
p16 = p8.double()
|
||||
assert p16 == Point(5, 16, a_24, mod)
|
||||
p32 = p16.double()
|
||||
assert p32 == Point(33, 96, a_24, mod)
|
||||
|
||||
# p3 = p2 + p1
|
||||
p3 = p2.add(p1, p1)
|
||||
assert p3 == Point(1, 61, a_24, mod)
|
||||
# p5 = p3 + p2 or p4 + p1
|
||||
p5 = p3.add(p2, p1)
|
||||
assert p5 == Point(49, 90, a_24, mod)
|
||||
assert p5 == p4.add(p1, p3)
|
||||
# p6 = 2*p3
|
||||
p6 = p3.double()
|
||||
assert p6 == Point(87, 43, a_24, mod)
|
||||
assert p6 == p4.add(p2, p2)
|
||||
# p7 = p5 + p2
|
||||
p7 = p5.add(p2, p3)
|
||||
assert p7 == Point(69, 23, a_24, mod)
|
||||
assert p7 == p4.add(p3, p1)
|
||||
assert p7 == p6.add(p1, p5)
|
||||
# p9 = p5 + p4
|
||||
p9 = p5.add(p4, p1)
|
||||
assert p9 == Point(56, 99, a_24, mod)
|
||||
assert p9 == p6.add(p3, p3)
|
||||
assert p9 == p7.add(p2, p5)
|
||||
assert p9 == p8.add(p1, p7)
|
||||
|
||||
assert p5 == p1.mont_ladder(5)
|
||||
assert p9 == p1.mont_ladder(9)
|
||||
assert p16 == p1.mont_ladder(16)
|
||||
assert p9 == p3.mont_ladder(3)
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
from sympy.core.numbers import Rational
|
||||
from sympy.ntheory.egyptian_fraction import egyptian_fraction
|
||||
from sympy.core.add import Add
|
||||
from sympy.testing.pytest import raises
|
||||
from sympy.core.random import random_complex_number
|
||||
|
||||
|
||||
def test_egyptian_fraction():
|
||||
def test_equality(r, alg="Greedy"):
|
||||
return r == Add(*[Rational(1, i) for i in egyptian_fraction(r, alg)])
|
||||
|
||||
r = random_complex_number(a=0, c=1, b=0, d=0, rational=True)
|
||||
assert test_equality(r)
|
||||
|
||||
assert egyptian_fraction(Rational(4, 17)) == [5, 29, 1233, 3039345]
|
||||
assert egyptian_fraction(Rational(7, 13), "Greedy") == [2, 26]
|
||||
assert egyptian_fraction(Rational(23, 101), "Greedy") == \
|
||||
[5, 37, 1438, 2985448, 40108045937720]
|
||||
assert egyptian_fraction(Rational(18, 23), "Takenouchi") == \
|
||||
[2, 6, 12, 35, 276, 2415]
|
||||
assert egyptian_fraction(Rational(5, 6), "Graham Jewett") == \
|
||||
[6, 7, 8, 9, 10, 42, 43, 44, 45, 56, 57, 58, 72, 73, 90, 1806, 1807,
|
||||
1808, 1892, 1893, 1980, 3192, 3193, 3306, 5256, 3263442, 3263443,
|
||||
3267056, 3581556, 10192056, 10650056950806]
|
||||
assert egyptian_fraction(Rational(5, 6), "Golomb") == [2, 6, 12, 20, 30]
|
||||
assert egyptian_fraction(Rational(5, 121), "Golomb") == [25, 1225, 3577, 7081, 11737]
|
||||
raises(ValueError, lambda: egyptian_fraction(Rational(-4, 9)))
|
||||
assert egyptian_fraction(Rational(8, 3), "Golomb") == [1, 2, 3, 4, 5, 6, 7,
|
||||
14, 574, 2788, 6460,
|
||||
11590, 33062, 113820]
|
||||
assert egyptian_fraction(Rational(355, 113)) == [1, 2, 3, 4, 5, 6, 7, 8, 9,
|
||||
10, 11, 12, 27, 744, 893588,
|
||||
1251493536607,
|
||||
20361068938197002344405230]
|
||||
|
||||
|
||||
def test_input():
|
||||
r = (2,3), Rational(2, 3), (Rational(2), Rational(3))
|
||||
for m in ["Greedy", "Graham Jewett", "Takenouchi", "Golomb"]:
|
||||
for i in r:
|
||||
d = egyptian_fraction(i, m)
|
||||
assert all(i.is_Integer for i in d)
|
||||
if m == "Graham Jewett":
|
||||
assert d == [3, 4, 12]
|
||||
else:
|
||||
assert d == [2, 6]
|
||||
# check prefix
|
||||
d = egyptian_fraction(Rational(5, 3))
|
||||
assert d == [1, 2, 6] and all(i.is_Integer for i in d)
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
from sympy.ntheory.elliptic_curve import EllipticCurve
|
||||
|
||||
|
||||
def test_elliptic_curve():
|
||||
# Point addition and multiplication
|
||||
e3 = EllipticCurve(-1, 9)
|
||||
p = e3(0, 3)
|
||||
q = e3(-1, 3)
|
||||
r = p + q
|
||||
assert r.x == 1 and r.y == -3
|
||||
r = 2*p + q
|
||||
assert r.x == 35 and r.y == 207
|
||||
r = -p + q
|
||||
assert r.x == 37 and r.y == 225
|
||||
# Verify result in http://www.lmfdb.org/EllipticCurve/Q
|
||||
# Discriminant
|
||||
assert EllipticCurve(-1, 9).discriminant == -34928
|
||||
assert EllipticCurve(-2731, -55146, 1, 0, 1).discriminant == 25088
|
||||
# Torsion points
|
||||
assert len(EllipticCurve(0, 1).torsion_points()) == 6
|
||||
|
|
@ -0,0 +1,702 @@
|
|||
from sympy.core.containers import Dict
|
||||
from sympy.core.mul import Mul
|
||||
from sympy.core.power import Pow
|
||||
from sympy.core.singleton import S
|
||||
from sympy.functions.combinatorial.factorials import factorial as fac
|
||||
from sympy.core.numbers import Integer, Rational
|
||||
from sympy.external.gmpy import gcd
|
||||
|
||||
from sympy.ntheory import (totient,
|
||||
factorint, primefactors, divisors, nextprime,
|
||||
pollard_rho, perfect_power, multiplicity, multiplicity_in_factorial,
|
||||
divisor_count, primorial, pollard_pm1, divisor_sigma,
|
||||
factorrat, reduced_totient)
|
||||
from sympy.ntheory.factor_ import (smoothness, smoothness_p, proper_divisors,
|
||||
antidivisors, antidivisor_count, _divisor_sigma, core, udivisors, udivisor_sigma,
|
||||
udivisor_count, proper_divisor_count, primenu, primeomega,
|
||||
mersenne_prime_exponent, is_perfect, is_abundant,
|
||||
is_deficient, is_amicable, is_carmichael, find_carmichael_numbers_in_range,
|
||||
find_first_n_carmichaels, dra, drm, _perfect_power, factor_cache)
|
||||
|
||||
from sympy.testing.pytest import raises, slow
|
||||
|
||||
from sympy.utilities.iterables import capture
|
||||
|
||||
|
||||
def fac_multiplicity(n, p):
|
||||
"""Return the power of the prime number p in the
|
||||
factorization of n!"""
|
||||
if p > n:
|
||||
return 0
|
||||
if p > n//2:
|
||||
return 1
|
||||
q, m = n, 0
|
||||
while q >= p:
|
||||
q //= p
|
||||
m += q
|
||||
return m
|
||||
|
||||
|
||||
def multiproduct(seq=(), start=1):
|
||||
"""
|
||||
Return the product of a sequence of factors with multiplicities,
|
||||
times the value of the parameter ``start``. The input may be a
|
||||
sequence of (factor, exponent) pairs or a dict of such pairs.
|
||||
|
||||
>>> multiproduct({3:7, 2:5}, 4) # = 3**7 * 2**5 * 4
|
||||
279936
|
||||
|
||||
"""
|
||||
if not seq:
|
||||
return start
|
||||
if isinstance(seq, dict):
|
||||
seq = iter(seq.items())
|
||||
units = start
|
||||
multi = []
|
||||
for base, exp in seq:
|
||||
if not exp:
|
||||
continue
|
||||
elif exp == 1:
|
||||
units *= base
|
||||
else:
|
||||
if exp % 2:
|
||||
units *= base
|
||||
multi.append((base, exp//2))
|
||||
return units * multiproduct(multi)**2
|
||||
|
||||
|
||||
def test_multiplicity():
|
||||
for b in range(2, 20):
|
||||
for i in range(100):
|
||||
assert multiplicity(b, b**i) == i
|
||||
assert multiplicity(b, (b**i) * 23) == i
|
||||
assert multiplicity(b, (b**i) * 1000249) == i
|
||||
# Should be fast
|
||||
assert multiplicity(10, 10**10023) == 10023
|
||||
# Should exit quickly
|
||||
assert multiplicity(10**10, 10**10) == 1
|
||||
# Should raise errors for bad input
|
||||
raises(ValueError, lambda: multiplicity(1, 1))
|
||||
raises(ValueError, lambda: multiplicity(1, 2))
|
||||
raises(ValueError, lambda: multiplicity(1.3, 2))
|
||||
raises(ValueError, lambda: multiplicity(2, 0))
|
||||
raises(ValueError, lambda: multiplicity(1.3, 0))
|
||||
|
||||
# handles Rationals
|
||||
assert multiplicity(10, Rational(30, 7)) == 1
|
||||
assert multiplicity(Rational(2, 7), Rational(4, 7)) == 1
|
||||
assert multiplicity(Rational(1, 7), Rational(3, 49)) == 2
|
||||
assert multiplicity(Rational(2, 7), Rational(7, 2)) == -1
|
||||
assert multiplicity(3, Rational(1, 9)) == -2
|
||||
|
||||
|
||||
def test_multiplicity_in_factorial():
|
||||
n = fac(1000)
|
||||
for i in (2, 4, 6, 12, 30, 36, 48, 60, 72, 96):
|
||||
assert multiplicity(i, n) == multiplicity_in_factorial(i, 1000)
|
||||
|
||||
|
||||
def test_private_perfect_power():
|
||||
assert _perfect_power(0) is False
|
||||
assert _perfect_power(1) is False
|
||||
assert _perfect_power(2) is False
|
||||
assert _perfect_power(3) is False
|
||||
for x in [2, 3, 5, 6, 7, 12, 15, 105, 100003]:
|
||||
for y in range(2, 100):
|
||||
assert _perfect_power(x**y) == (x, y)
|
||||
if x & 1:
|
||||
assert _perfect_power(x**y, next_p=3) == (x, y)
|
||||
if x == 100003:
|
||||
assert _perfect_power(x**y, next_p=100003) == (x, y)
|
||||
assert _perfect_power(101*x**y) == False
|
||||
# Catalan's conjecture
|
||||
if x**y not in [8, 9]:
|
||||
assert _perfect_power(x**y + 1) == False
|
||||
assert _perfect_power(x**y - 1) == False
|
||||
for x in range(1, 10):
|
||||
for y in range(1, 10):
|
||||
g = gcd(x, y)
|
||||
if g == 1:
|
||||
assert _perfect_power(5**x * 101**y) == False
|
||||
else:
|
||||
assert _perfect_power(5**x * 101**y) == (5**(x//g) * 101**(y//g), g)
|
||||
|
||||
|
||||
def test_perfect_power():
|
||||
raises(ValueError, lambda: perfect_power(0.1))
|
||||
assert perfect_power(0) is False
|
||||
assert perfect_power(1) is False
|
||||
assert perfect_power(2) is False
|
||||
assert perfect_power(3) is False
|
||||
assert perfect_power(4) == (2, 2)
|
||||
assert perfect_power(14) is False
|
||||
assert perfect_power(25) == (5, 2)
|
||||
assert perfect_power(22) is False
|
||||
assert perfect_power(22, [2]) is False
|
||||
assert perfect_power(137**(3*5*13)) == (137, 3*5*13)
|
||||
assert perfect_power(137**(3*5*13) + 1) is False
|
||||
assert perfect_power(137**(3*5*13) - 1) is False
|
||||
assert perfect_power(103005006004**7) == (103005006004, 7)
|
||||
assert perfect_power(103005006004**7 + 1) is False
|
||||
assert perfect_power(103005006004**7 - 1) is False
|
||||
assert perfect_power(103005006004**12) == (103005006004, 12)
|
||||
assert perfect_power(103005006004**12 + 1) is False
|
||||
assert perfect_power(103005006004**12 - 1) is False
|
||||
assert perfect_power(2**10007) == (2, 10007)
|
||||
assert perfect_power(2**10007 + 1) is False
|
||||
assert perfect_power(2**10007 - 1) is False
|
||||
assert perfect_power((9**99 + 1)**60) == (9**99 + 1, 60)
|
||||
assert perfect_power((9**99 + 1)**60 + 1) is False
|
||||
assert perfect_power((9**99 + 1)**60 - 1) is False
|
||||
assert perfect_power((10**40000)**2, big=False) == (10**40000, 2)
|
||||
assert perfect_power(10**100000) == (10, 100000)
|
||||
assert perfect_power(10**100001) == (10, 100001)
|
||||
assert perfect_power(13**4, [3, 5]) is False
|
||||
assert perfect_power(3**4, [3, 10], factor=0) is False
|
||||
assert perfect_power(3**3*5**3) == (15, 3)
|
||||
assert perfect_power(2**3*5**5) is False
|
||||
assert perfect_power(2*13**4) is False
|
||||
assert perfect_power(2**5*3**3) is False
|
||||
t = 2**24
|
||||
for d in divisors(24):
|
||||
m = perfect_power(t*3**d)
|
||||
assert m and m[1] == d or d == 1
|
||||
m = perfect_power(t*3**d, big=False)
|
||||
assert m and m[1] == 2 or d == 1 or d == 3, (d, m)
|
||||
|
||||
# negatives and non-integer rationals
|
||||
assert perfect_power(-4) is False
|
||||
assert perfect_power(-8) == (-2, 3)
|
||||
assert perfect_power(-S(1)/8) == (-S(1)/2, 3)
|
||||
assert perfect_power(S(1)/3) == False
|
||||
assert perfect_power(-5**15) == (-5, 15)
|
||||
assert perfect_power(-5**15, big=False) == (-3125, 3)
|
||||
assert perfect_power(-5**15, [15]) == (-5, 15)
|
||||
|
||||
n = -3 ** 60
|
||||
assert perfect_power(n) == (-81, 15)
|
||||
assert perfect_power(n, big=False) == (-3486784401, 3)
|
||||
assert perfect_power(n, [3, 5], big=True) == (-531441, 5)
|
||||
assert perfect_power(n, [3, 5], big=False) == (-3486784401, 3)
|
||||
assert perfect_power(n, [2]) == False
|
||||
assert perfect_power(n, [2, 15]) == (-81, 15)
|
||||
assert perfect_power(n, [2, 13]) == False
|
||||
assert perfect_power(n, [17]) == False
|
||||
assert perfect_power(n, [3]) == (-3486784401, 3)
|
||||
assert perfect_power(n + 1) == False
|
||||
|
||||
r = S(2) ** (2 * 5 * 7) / S(3) ** (2 * 7)
|
||||
assert perfect_power(r) == (S(32) / 3, 14)
|
||||
assert perfect_power(-r) == (-S(1024) / 9, 7)
|
||||
assert perfect_power(r, big=False) == (S(34359738368) / 2187, 2)
|
||||
assert perfect_power(r, [2, 5]) == (S(34359738368) / 2187, 2)
|
||||
assert perfect_power(r, [5, 7]) == (S(1024) / 9, 7)
|
||||
assert perfect_power(r, [5, 7], big=False) == (S(1024) / 9, 7)
|
||||
assert perfect_power(r, [2, 5, 7], big=False) == (S(34359738368) / 2187, 2)
|
||||
assert perfect_power(-r, [5, 7], big=False) == (-S(1024) / 9, 7)
|
||||
|
||||
assert perfect_power(-S(1) / 8) == (-S(1) / 2, 3)
|
||||
|
||||
assert perfect_power((-3)**60) == (3, 60)
|
||||
assert perfect_power((-3)**61) == (-3, 61)
|
||||
|
||||
assert perfect_power(S(2 ** 9) / 3 ** 12) == (S(8)/81, 3)
|
||||
assert perfect_power(Rational(1, 2)**3) == (S.Half, 3)
|
||||
assert perfect_power(Rational(-3, 2)**3) == (-3*S.Half, 3)
|
||||
|
||||
|
||||
def test_factor_cache():
|
||||
factor_cache.cache_clear()
|
||||
raises(ValueError, lambda: factor_cache.__setitem__(1, 5))
|
||||
raises(ValueError, lambda: factor_cache.__setitem__(10, 1))
|
||||
raises(ValueError, lambda: factor_cache.__setitem__(10, 10))
|
||||
raises(ValueError, lambda: factor_cache.__setitem__(10, 3))
|
||||
raises(ValueError, lambda: factor_cache.__setitem__(20, 4))
|
||||
factor_cache.maxsize = 3
|
||||
for i in range(2, 10):
|
||||
factor_cache[5*i] = 5
|
||||
assert len(factor_cache) == 3
|
||||
factor_cache.maxsize = 5
|
||||
for i in range(2, 10):
|
||||
factor_cache[5*i] = 5
|
||||
assert len(factor_cache) == 5
|
||||
factor_cache.maxsize = 2
|
||||
assert len(factor_cache) == 2
|
||||
factor_cache.maxsize =1000
|
||||
|
||||
factor_cache.cache_clear()
|
||||
factor_cache[40] = 5
|
||||
assert factor_cache.get(40) == 5
|
||||
assert factor_cache.get(20) is None
|
||||
assert factor_cache[40] == 5
|
||||
raises(KeyError, lambda: factor_cache[10])
|
||||
del factor_cache[40]
|
||||
assert len(factor_cache) == 0
|
||||
raises(KeyError, lambda: factor_cache.__delitem__(40))
|
||||
factor_cache.add(100, [5, 2])
|
||||
assert len(factor_cache) == 2
|
||||
assert factor_cache[100] == 5
|
||||
|
||||
for n in [1000000007, 10000019*20000003]:
|
||||
factorint(n)
|
||||
assert n in factor_cache
|
||||
|
||||
# Restore the initial state
|
||||
factor_cache.cache_clear()
|
||||
factor_cache.maxsize = 1000
|
||||
|
||||
|
||||
@slow
|
||||
def test_factorint():
|
||||
assert primefactors(123456) == [2, 3, 643]
|
||||
assert factorint(0) == {0: 1}
|
||||
assert factorint(1) == {}
|
||||
assert factorint(-1) == {-1: 1}
|
||||
assert factorint(-2) == {-1: 1, 2: 1}
|
||||
assert factorint(-16) == {-1: 1, 2: 4}
|
||||
assert factorint(2) == {2: 1}
|
||||
assert factorint(126) == {2: 1, 3: 2, 7: 1}
|
||||
assert factorint(123456) == {2: 6, 3: 1, 643: 1}
|
||||
assert factorint(5951757) == {3: 1, 7: 1, 29: 2, 337: 1}
|
||||
assert factorint(64015937) == {7993: 1, 8009: 1}
|
||||
assert factorint(2**(2**6) + 1) == {274177: 1, 67280421310721: 1}
|
||||
#issue 19683
|
||||
assert factorint(10**38 - 1) == {3: 2, 11: 1, 909090909090909091: 1, 1111111111111111111: 1}
|
||||
#issue 17676
|
||||
assert factorint(28300421052393658575) == {3: 1, 5: 2, 11: 2, 43: 1, 2063: 2, 4127: 1, 4129: 1}
|
||||
assert factorint(2063**2 * 4127**1 * 4129**1) == {2063: 2, 4127: 1, 4129: 1}
|
||||
assert factorint(2347**2 * 7039**1 * 7043**1) == {2347: 2, 7039: 1, 7043: 1}
|
||||
|
||||
assert factorint(0, multiple=True) == [0]
|
||||
assert factorint(1, multiple=True) == []
|
||||
assert factorint(-1, multiple=True) == [-1]
|
||||
assert factorint(-2, multiple=True) == [-1, 2]
|
||||
assert factorint(-16, multiple=True) == [-1, 2, 2, 2, 2]
|
||||
assert factorint(2, multiple=True) == [2]
|
||||
assert factorint(24, multiple=True) == [2, 2, 2, 3]
|
||||
assert factorint(126, multiple=True) == [2, 3, 3, 7]
|
||||
assert factorint(123456, multiple=True) == [2, 2, 2, 2, 2, 2, 3, 643]
|
||||
assert factorint(5951757, multiple=True) == [3, 7, 29, 29, 337]
|
||||
assert factorint(64015937, multiple=True) == [7993, 8009]
|
||||
assert factorint(2**(2**6) + 1, multiple=True) == [274177, 67280421310721]
|
||||
|
||||
assert factorint(fac(1, evaluate=False)) == {}
|
||||
assert factorint(fac(7, evaluate=False)) == {2: 4, 3: 2, 5: 1, 7: 1}
|
||||
assert factorint(fac(15, evaluate=False)) == \
|
||||
{2: 11, 3: 6, 5: 3, 7: 2, 11: 1, 13: 1}
|
||||
assert factorint(fac(20, evaluate=False)) == \
|
||||
{2: 18, 3: 8, 5: 4, 7: 2, 11: 1, 13: 1, 17: 1, 19: 1}
|
||||
assert factorint(fac(23, evaluate=False)) == \
|
||||
{2: 19, 3: 9, 5: 4, 7: 3, 11: 2, 13: 1, 17: 1, 19: 1, 23: 1}
|
||||
|
||||
assert multiproduct(factorint(fac(200))) == fac(200)
|
||||
assert multiproduct(factorint(fac(200, evaluate=False))) == fac(200)
|
||||
for b, e in factorint(fac(150)).items():
|
||||
assert e == fac_multiplicity(150, b)
|
||||
for b, e in factorint(fac(150, evaluate=False)).items():
|
||||
assert e == fac_multiplicity(150, b)
|
||||
assert factorint(103005006059**7) == {103005006059: 7}
|
||||
assert factorint(31337**191) == {31337: 191}
|
||||
assert factorint(2**1000 * 3**500 * 257**127 * 383**60) == \
|
||||
{2: 1000, 3: 500, 257: 127, 383: 60}
|
||||
assert len(factorint(fac(10000))) == 1229
|
||||
assert len(factorint(fac(10000, evaluate=False))) == 1229
|
||||
assert factorint(12932983746293756928584532764589230) == \
|
||||
{2: 1, 5: 1, 73: 1, 727719592270351: 1, 63564265087747: 1, 383: 1}
|
||||
assert factorint(727719592270351) == {727719592270351: 1}
|
||||
assert factorint(2**64 + 1, use_trial=False) == factorint(2**64 + 1)
|
||||
for n in range(60000):
|
||||
assert multiproduct(factorint(n)) == n
|
||||
assert pollard_rho(2**64 + 1, seed=1) == 274177
|
||||
assert pollard_rho(19, seed=1) is None
|
||||
assert factorint(3, limit=2) == {3: 1}
|
||||
assert factorint(12345) == {3: 1, 5: 1, 823: 1}
|
||||
assert factorint(
|
||||
12345, limit=3) == {4115: 1, 3: 1} # the 5 is greater than the limit
|
||||
assert factorint(1, limit=1) == {}
|
||||
assert factorint(0, 3) == {0: 1}
|
||||
assert factorint(12, limit=1) == {12: 1}
|
||||
assert factorint(30, limit=2) == {2: 1, 15: 1}
|
||||
assert factorint(16, limit=2) == {2: 4}
|
||||
assert factorint(124, limit=3) == {2: 2, 31: 1}
|
||||
assert factorint(4*31**2, limit=3) == {2: 2, 31: 2}
|
||||
p1 = nextprime(2**32)
|
||||
p2 = nextprime(2**16)
|
||||
p3 = nextprime(p2)
|
||||
assert factorint(p1*p2*p3) == {p1: 1, p2: 1, p3: 1}
|
||||
assert factorint(13*17*19, limit=15) == {13: 1, 17*19: 1}
|
||||
assert factorint(1951*15013*15053, limit=2000) == {225990689: 1, 1951: 1}
|
||||
assert factorint(primorial(17) + 1, use_pm1=0) == \
|
||||
{int(19026377261): 1, 3467: 1, 277: 1, 105229: 1}
|
||||
# when prime b is closer than approx sqrt(8*p) to prime p then they are
|
||||
# "close" and have a trivial factorization
|
||||
a = nextprime(2**2**8) # 78 digits
|
||||
b = nextprime(a + 2**2**4)
|
||||
assert 'Fermat' in capture(lambda: factorint(a*b, verbose=1))
|
||||
|
||||
raises(ValueError, lambda: pollard_rho(4))
|
||||
raises(ValueError, lambda: pollard_pm1(3))
|
||||
raises(ValueError, lambda: pollard_pm1(10, B=2))
|
||||
# verbose coverage
|
||||
n = nextprime(2**16)*nextprime(2**17)*nextprime(1901)
|
||||
assert 'with primes' in capture(lambda: factorint(n, verbose=1))
|
||||
capture(lambda: factorint(nextprime(2**16)*1012, verbose=1))
|
||||
|
||||
n = nextprime(2**17)
|
||||
capture(lambda: factorint(n**3, verbose=1)) # perfect power termination
|
||||
capture(lambda: factorint(2*n, verbose=1)) # factoring complete msg
|
||||
|
||||
# exceed 1st
|
||||
n = nextprime(2**17)
|
||||
n *= nextprime(n)
|
||||
assert '1000' in capture(lambda: factorint(n, limit=1000, verbose=1))
|
||||
n *= nextprime(n)
|
||||
assert len(factorint(n)) == 3
|
||||
assert len(factorint(n, limit=p1)) == 3
|
||||
n *= nextprime(2*n)
|
||||
# exceed 2nd
|
||||
assert '2001' in capture(lambda: factorint(n, limit=2000, verbose=1))
|
||||
assert capture(
|
||||
lambda: factorint(n, limit=4000, verbose=1)).count('Pollard') == 2
|
||||
# non-prime pm1 result
|
||||
n = nextprime(8069)
|
||||
n *= nextprime(2*n)*nextprime(2*n, 2)
|
||||
capture(lambda: factorint(n, verbose=1)) # non-prime pm1 result
|
||||
# factor fermat composite
|
||||
p1 = nextprime(2**17)
|
||||
p2 = nextprime(2*p1)
|
||||
assert factorint((p1*p2**2)**3) == {p1: 3, p2: 6}
|
||||
# Test for non integer input
|
||||
raises(ValueError, lambda: factorint(4.5))
|
||||
# test dict/Dict input
|
||||
sans = '2**10*3**3'
|
||||
n = {4: 2, 12: 3}
|
||||
assert str(factorint(n)) == sans
|
||||
assert str(factorint(Dict(n))) == sans
|
||||
|
||||
|
||||
def test_divisors_and_divisor_count():
|
||||
assert divisors(-1) == [1]
|
||||
assert divisors(0) == []
|
||||
assert divisors(1) == [1]
|
||||
assert divisors(2) == [1, 2]
|
||||
assert divisors(3) == [1, 3]
|
||||
assert divisors(17) == [1, 17]
|
||||
assert divisors(10) == [1, 2, 5, 10]
|
||||
assert divisors(100) == [1, 2, 4, 5, 10, 20, 25, 50, 100]
|
||||
assert divisors(101) == [1, 101]
|
||||
assert type(divisors(2, generator=True)) is not list
|
||||
|
||||
assert divisor_count(0) == 0
|
||||
assert divisor_count(-1) == 1
|
||||
assert divisor_count(1) == 1
|
||||
assert divisor_count(6) == 4
|
||||
assert divisor_count(12) == 6
|
||||
|
||||
assert divisor_count(180, 3) == divisor_count(180//3)
|
||||
assert divisor_count(2*3*5, 7) == 0
|
||||
|
||||
|
||||
def test_proper_divisors_and_proper_divisor_count():
|
||||
assert proper_divisors(-1) == []
|
||||
assert proper_divisors(0) == []
|
||||
assert proper_divisors(1) == []
|
||||
assert proper_divisors(2) == [1]
|
||||
assert proper_divisors(3) == [1]
|
||||
assert proper_divisors(17) == [1]
|
||||
assert proper_divisors(10) == [1, 2, 5]
|
||||
assert proper_divisors(100) == [1, 2, 4, 5, 10, 20, 25, 50]
|
||||
assert proper_divisors(1000000007) == [1]
|
||||
assert type(proper_divisors(2, generator=True)) is not list
|
||||
|
||||
assert proper_divisor_count(0) == 0
|
||||
assert proper_divisor_count(-1) == 0
|
||||
assert proper_divisor_count(1) == 0
|
||||
assert proper_divisor_count(36) == 8
|
||||
assert proper_divisor_count(2*3*5) == 7
|
||||
|
||||
|
||||
def test_udivisors_and_udivisor_count():
|
||||
assert udivisors(-1) == [1]
|
||||
assert udivisors(0) == []
|
||||
assert udivisors(1) == [1]
|
||||
assert udivisors(2) == [1, 2]
|
||||
assert udivisors(3) == [1, 3]
|
||||
assert udivisors(17) == [1, 17]
|
||||
assert udivisors(10) == [1, 2, 5, 10]
|
||||
assert udivisors(100) == [1, 4, 25, 100]
|
||||
assert udivisors(101) == [1, 101]
|
||||
assert udivisors(1000) == [1, 8, 125, 1000]
|
||||
assert type(udivisors(2, generator=True)) is not list
|
||||
|
||||
assert udivisor_count(0) == 0
|
||||
assert udivisor_count(-1) == 1
|
||||
assert udivisor_count(1) == 1
|
||||
assert udivisor_count(6) == 4
|
||||
assert udivisor_count(12) == 4
|
||||
|
||||
assert udivisor_count(180) == 8
|
||||
assert udivisor_count(2*3*5*7) == 16
|
||||
|
||||
|
||||
def test_issue_6981():
|
||||
S = set(divisors(4)).union(set(divisors(Integer(2))))
|
||||
assert S == {1,2,4}
|
||||
|
||||
|
||||
def test_issue_4356():
|
||||
assert factorint(1030903) == {53: 2, 367: 1}
|
||||
|
||||
|
||||
def test_divisors():
|
||||
assert divisors(28) == [1, 2, 4, 7, 14, 28]
|
||||
assert list(divisors(3*5*7, 1)) == [1, 3, 5, 15, 7, 21, 35, 105]
|
||||
assert divisors(0) == []
|
||||
|
||||
|
||||
def test_divisor_count():
|
||||
assert divisor_count(0) == 0
|
||||
assert divisor_count(6) == 4
|
||||
|
||||
|
||||
def test_proper_divisors():
|
||||
assert proper_divisors(-1) == []
|
||||
assert proper_divisors(28) == [1, 2, 4, 7, 14]
|
||||
assert list(proper_divisors(3*5*7, True)) == [1, 3, 5, 15, 7, 21, 35]
|
||||
|
||||
|
||||
def test_proper_divisor_count():
|
||||
assert proper_divisor_count(6) == 3
|
||||
assert proper_divisor_count(108) == 11
|
||||
|
||||
|
||||
def test_antidivisors():
|
||||
assert antidivisors(-1) == []
|
||||
assert antidivisors(-3) == [2]
|
||||
assert antidivisors(14) == [3, 4, 9]
|
||||
assert antidivisors(237) == [2, 5, 6, 11, 19, 25, 43, 95, 158]
|
||||
assert antidivisors(12345) == [2, 6, 7, 10, 30, 1646, 3527, 4938, 8230]
|
||||
assert antidivisors(393216) == [262144]
|
||||
assert sorted(x for x in antidivisors(3*5*7, 1)) == \
|
||||
[2, 6, 10, 11, 14, 19, 30, 42, 70]
|
||||
assert antidivisors(1) == []
|
||||
assert type(antidivisors(2, generator=True)) is not list
|
||||
|
||||
def test_antidivisor_count():
|
||||
assert antidivisor_count(0) == 0
|
||||
assert antidivisor_count(-1) == 0
|
||||
assert antidivisor_count(-4) == 1
|
||||
assert antidivisor_count(20) == 3
|
||||
assert antidivisor_count(25) == 5
|
||||
assert antidivisor_count(38) == 7
|
||||
assert antidivisor_count(180) == 6
|
||||
assert antidivisor_count(2*3*5) == 3
|
||||
|
||||
|
||||
def test_smoothness_and_smoothness_p():
|
||||
assert smoothness(1) == (1, 1)
|
||||
assert smoothness(2**4*3**2) == (3, 16)
|
||||
|
||||
assert smoothness_p(10431, m=1) == \
|
||||
(1, [(3, (2, 2, 4)), (19, (1, 5, 5)), (61, (1, 31, 31))])
|
||||
assert smoothness_p(10431) == \
|
||||
(-1, [(3, (2, 2, 2)), (19, (1, 3, 9)), (61, (1, 5, 5))])
|
||||
assert smoothness_p(10431, power=1) == \
|
||||
(-1, [(3, (2, 2, 2)), (61, (1, 5, 5)), (19, (1, 3, 9))])
|
||||
assert smoothness_p(21477639576571, visual=1) == \
|
||||
'p**i=4410317**1 has p-1 B=1787, B-pow=1787\n' + \
|
||||
'p**i=4869863**1 has p-1 B=2434931, B-pow=2434931'
|
||||
|
||||
|
||||
def test_visual_factorint():
|
||||
assert factorint(1, visual=1) == 1
|
||||
forty2 = factorint(42, visual=True)
|
||||
assert type(forty2) == Mul
|
||||
assert str(forty2) == '2**1*3**1*7**1'
|
||||
assert factorint(1, visual=True) is S.One
|
||||
no = {"evaluate": False}
|
||||
assert factorint(42**2, visual=True) == Mul(Pow(2, 2, **no),
|
||||
Pow(3, 2, **no),
|
||||
Pow(7, 2, **no), **no)
|
||||
assert -1 in factorint(-42, visual=True).args
|
||||
|
||||
|
||||
def test_factorrat():
|
||||
assert str(factorrat(S(12)/1, visual=True)) == '2**2*3**1'
|
||||
assert str(factorrat(Rational(1, 1), visual=True)) == '1'
|
||||
assert str(factorrat(S(25)/14, visual=True)) == '5**2/(2*7)'
|
||||
assert str(factorrat(Rational(25, 14), visual=True)) == '5**2/(2*7)'
|
||||
assert str(factorrat(S(-25)/14/9, visual=True)) == '-1*5**2/(2*3**2*7)'
|
||||
|
||||
assert factorrat(S(12)/1, multiple=True) == [2, 2, 3]
|
||||
assert factorrat(Rational(1, 1), multiple=True) == []
|
||||
assert factorrat(S(25)/14, multiple=True) == [Rational(1, 7), S.Half, 5, 5]
|
||||
assert factorrat(Rational(25, 14), multiple=True) == [Rational(1, 7), S.Half, 5, 5]
|
||||
assert factorrat(Rational(12, 1), multiple=True) == [2, 2, 3]
|
||||
assert factorrat(S(-25)/14/9, multiple=True) == \
|
||||
[-1, Rational(1, 7), Rational(1, 3), Rational(1, 3), S.Half, 5, 5]
|
||||
|
||||
|
||||
def test_visual_io():
|
||||
sm = smoothness_p
|
||||
fi = factorint
|
||||
# with smoothness_p
|
||||
n = 124
|
||||
d = fi(n)
|
||||
m = fi(d, visual=True)
|
||||
t = sm(n)
|
||||
s = sm(t)
|
||||
for th in [d, s, t, n, m]:
|
||||
assert sm(th, visual=True) == s
|
||||
assert sm(th, visual=1) == s
|
||||
for th in [d, s, t, n, m]:
|
||||
assert sm(th, visual=False) == t
|
||||
assert [sm(th, visual=None) for th in [d, s, t, n, m]] == [s, d, s, t, t]
|
||||
assert [sm(th, visual=2) for th in [d, s, t, n, m]] == [s, d, s, t, t]
|
||||
|
||||
# with factorint
|
||||
for th in [d, m, n]:
|
||||
assert fi(th, visual=True) == m
|
||||
assert fi(th, visual=1) == m
|
||||
for th in [d, m, n]:
|
||||
assert fi(th, visual=False) == d
|
||||
assert [fi(th, visual=None) for th in [d, m, n]] == [m, d, d]
|
||||
assert [fi(th, visual=0) for th in [d, m, n]] == [m, d, d]
|
||||
|
||||
# test reevaluation
|
||||
no = {"evaluate": False}
|
||||
assert sm({4: 2}, visual=False) == sm(16)
|
||||
assert sm(Mul(*[Pow(k, v, **no) for k, v in {4: 2, 2: 6}.items()], **no),
|
||||
visual=False) == sm(2**10)
|
||||
|
||||
assert fi({4: 2}, visual=False) == fi(16)
|
||||
assert fi(Mul(*[Pow(k, v, **no) for k, v in {4: 2, 2: 6}.items()], **no),
|
||||
visual=False) == fi(2**10)
|
||||
|
||||
|
||||
def test_core():
|
||||
assert core(35**13, 10) == 42875
|
||||
assert core(210**2) == 1
|
||||
assert core(7776, 3) == 36
|
||||
assert core(10**27, 22) == 10**5
|
||||
assert core(537824) == 14
|
||||
assert core(1, 6) == 1
|
||||
|
||||
|
||||
def test__divisor_sigma():
|
||||
assert _divisor_sigma(23450) == 50592
|
||||
assert _divisor_sigma(23450, 0) == 24
|
||||
assert _divisor_sigma(23450, 1) == 50592
|
||||
assert _divisor_sigma(23450, 2) == 730747500
|
||||
assert _divisor_sigma(23450, 3) == 14666785333344
|
||||
A000005 = [1, 2, 2, 3, 2, 4, 2, 4, 3, 4, 2, 6, 2, 4, 4, 5, 2, 6, 2, 6, 4,
|
||||
4, 2, 8, 3, 4, 4, 6, 2, 8, 2, 6, 4, 4, 4, 9, 2, 4, 4, 8, 2, 8]
|
||||
for n, val in enumerate(A000005, 1):
|
||||
assert _divisor_sigma(n, 0) == val
|
||||
A000203 = [1, 3, 4, 7, 6, 12, 8, 15, 13, 18, 12, 28, 14, 24, 24, 31, 18,
|
||||
39, 20, 42, 32, 36, 24, 60, 31, 42, 40, 56, 30, 72, 32, 63, 48]
|
||||
for n, val in enumerate(A000203, 1):
|
||||
assert _divisor_sigma(n, 1) == val
|
||||
A001157 = [1, 5, 10, 21, 26, 50, 50, 85, 91, 130, 122, 210, 170, 250, 260,
|
||||
341, 290, 455, 362, 546, 500, 610, 530, 850, 651, 850, 820, 1050]
|
||||
for n, val in enumerate(A001157, 1):
|
||||
assert _divisor_sigma(n, 2) == val
|
||||
|
||||
|
||||
def test_mersenne_prime_exponent():
|
||||
assert mersenne_prime_exponent(1) == 2
|
||||
assert mersenne_prime_exponent(4) == 7
|
||||
assert mersenne_prime_exponent(10) == 89
|
||||
assert mersenne_prime_exponent(25) == 21701
|
||||
raises(ValueError, lambda: mersenne_prime_exponent(52))
|
||||
raises(ValueError, lambda: mersenne_prime_exponent(0))
|
||||
|
||||
|
||||
def test_is_perfect():
|
||||
assert is_perfect(-6) is False
|
||||
assert is_perfect(6) is True
|
||||
assert is_perfect(15) is False
|
||||
assert is_perfect(28) is True
|
||||
assert is_perfect(400) is False
|
||||
assert is_perfect(496) is True
|
||||
assert is_perfect(8128) is True
|
||||
assert is_perfect(10000) is False
|
||||
|
||||
|
||||
def test_is_abundant():
|
||||
assert is_abundant(10) is False
|
||||
assert is_abundant(12) is True
|
||||
assert is_abundant(18) is True
|
||||
assert is_abundant(21) is False
|
||||
assert is_abundant(945) is True
|
||||
|
||||
|
||||
def test_is_deficient():
|
||||
assert is_deficient(10) is True
|
||||
assert is_deficient(22) is True
|
||||
assert is_deficient(56) is False
|
||||
assert is_deficient(20) is False
|
||||
assert is_deficient(36) is False
|
||||
|
||||
|
||||
def test_is_amicable():
|
||||
assert is_amicable(173, 129) is False
|
||||
assert is_amicable(220, 284) is True
|
||||
assert is_amicable(8756, 8756) is False
|
||||
|
||||
|
||||
def test_is_carmichael():
|
||||
A002997 = [561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841,
|
||||
29341, 41041, 46657, 52633, 62745, 63973, 75361, 101101]
|
||||
for n in range(1, 5000):
|
||||
assert is_carmichael(n) == (n in A002997)
|
||||
for n in A002997:
|
||||
assert is_carmichael(n)
|
||||
|
||||
|
||||
def test_find_carmichael_numbers_in_range():
|
||||
assert find_carmichael_numbers_in_range(0, 561) == []
|
||||
assert find_carmichael_numbers_in_range(561, 562) == [561]
|
||||
assert find_carmichael_numbers_in_range(561, 1105) == find_carmichael_numbers_in_range(561, 562)
|
||||
raises(ValueError, lambda: find_carmichael_numbers_in_range(-2, 2))
|
||||
raises(ValueError, lambda: find_carmichael_numbers_in_range(22, 2))
|
||||
|
||||
|
||||
def test_find_first_n_carmichaels():
|
||||
assert find_first_n_carmichaels(0) == []
|
||||
assert find_first_n_carmichaels(1) == [561]
|
||||
assert find_first_n_carmichaels(2) == [561, 1105]
|
||||
|
||||
|
||||
def test_dra():
|
||||
assert dra(19, 12) == 8
|
||||
assert dra(2718, 10) == 9
|
||||
assert dra(0, 22) == 0
|
||||
assert dra(23456789, 10) == 8
|
||||
raises(ValueError, lambda: dra(24, -2))
|
||||
raises(ValueError, lambda: dra(24.2, 5))
|
||||
|
||||
def test_drm():
|
||||
assert drm(19, 12) == 7
|
||||
assert drm(2718, 10) == 2
|
||||
assert drm(0, 15) == 0
|
||||
assert drm(234161, 10) == 6
|
||||
raises(ValueError, lambda: drm(24, -2))
|
||||
raises(ValueError, lambda: drm(11.6, 9))
|
||||
|
||||
|
||||
def test_deprecated_ntheory_symbolic_functions():
|
||||
from sympy.testing.pytest import warns_deprecated_sympy
|
||||
|
||||
with warns_deprecated_sympy():
|
||||
assert primenu(3) == 1
|
||||
with warns_deprecated_sympy():
|
||||
assert primeomega(3) == 1
|
||||
with warns_deprecated_sympy():
|
||||
assert totient(3) == 2
|
||||
with warns_deprecated_sympy():
|
||||
assert reduced_totient(3) == 2
|
||||
with warns_deprecated_sympy():
|
||||
assert divisor_sigma(3) == 4
|
||||
with warns_deprecated_sympy():
|
||||
assert udivisor_sigma(3) == 4
|
||||
|
|
@ -0,0 +1,285 @@
|
|||
from bisect import bisect, bisect_left
|
||||
|
||||
from sympy.functions.combinatorial.numbers import mobius, totient
|
||||
from sympy.ntheory.generate import (sieve, Sieve)
|
||||
|
||||
from sympy.ntheory import isprime, randprime, nextprime, prevprime, \
|
||||
primerange, primepi, prime, primorial, composite, compositepi
|
||||
from sympy.ntheory.generate import cycle_length, _primepi
|
||||
from sympy.ntheory.primetest import mr
|
||||
from sympy.testing.pytest import raises
|
||||
|
||||
def test_prime():
|
||||
assert prime(1) == 2
|
||||
assert prime(2) == 3
|
||||
assert prime(5) == 11
|
||||
assert prime(11) == 31
|
||||
assert prime(57) == 269
|
||||
assert prime(296) == 1949
|
||||
assert prime(559) == 4051
|
||||
assert prime(3000) == 27449
|
||||
assert prime(4096) == 38873
|
||||
assert prime(9096) == 94321
|
||||
assert prime(25023) == 287341
|
||||
assert prime(10000000) == 179424673 # issue #20951
|
||||
assert prime(99999999) == 2038074739
|
||||
raises(ValueError, lambda: prime(0))
|
||||
sieve.extend(3000)
|
||||
assert prime(401) == 2749
|
||||
raises(ValueError, lambda: prime(-1))
|
||||
|
||||
|
||||
def test__primepi():
|
||||
assert _primepi(-1) == 0
|
||||
assert _primepi(1) == 0
|
||||
assert _primepi(2) == 1
|
||||
assert _primepi(5) == 3
|
||||
assert _primepi(11) == 5
|
||||
assert _primepi(57) == 16
|
||||
assert _primepi(296) == 62
|
||||
assert _primepi(559) == 102
|
||||
assert _primepi(3000) == 430
|
||||
assert _primepi(4096) == 564
|
||||
assert _primepi(9096) == 1128
|
||||
assert _primepi(25023) == 2763
|
||||
assert _primepi(10**8) == 5761455
|
||||
assert _primepi(253425253) == 13856396
|
||||
assert _primepi(8769575643) == 401464322
|
||||
sieve.extend(3000)
|
||||
assert _primepi(2000) == 303
|
||||
|
||||
|
||||
def test_composite():
|
||||
from sympy.ntheory.generate import sieve
|
||||
sieve._reset()
|
||||
assert composite(1) == 4
|
||||
assert composite(2) == 6
|
||||
assert composite(5) == 10
|
||||
assert composite(11) == 20
|
||||
assert composite(41) == 58
|
||||
assert composite(57) == 80
|
||||
assert composite(296) == 370
|
||||
assert composite(559) == 684
|
||||
assert composite(3000) == 3488
|
||||
assert composite(4096) == 4736
|
||||
assert composite(9096) == 10368
|
||||
assert composite(25023) == 28088
|
||||
sieve.extend(3000)
|
||||
assert composite(1957) == 2300
|
||||
assert composite(2568) == 2998
|
||||
raises(ValueError, lambda: composite(0))
|
||||
|
||||
|
||||
def test_compositepi():
|
||||
assert compositepi(1) == 0
|
||||
assert compositepi(2) == 0
|
||||
assert compositepi(5) == 1
|
||||
assert compositepi(11) == 5
|
||||
assert compositepi(57) == 40
|
||||
assert compositepi(296) == 233
|
||||
assert compositepi(559) == 456
|
||||
assert compositepi(3000) == 2569
|
||||
assert compositepi(4096) == 3531
|
||||
assert compositepi(9096) == 7967
|
||||
assert compositepi(25023) == 22259
|
||||
assert compositepi(10**8) == 94238544
|
||||
assert compositepi(253425253) == 239568856
|
||||
assert compositepi(8769575643) == 8368111320
|
||||
sieve.extend(3000)
|
||||
assert compositepi(2321) == 1976
|
||||
|
||||
|
||||
def test_generate():
|
||||
from sympy.ntheory.generate import sieve
|
||||
sieve._reset()
|
||||
assert nextprime(-4) == 2
|
||||
assert nextprime(2) == 3
|
||||
assert nextprime(5) == 7
|
||||
assert nextprime(12) == 13
|
||||
assert prevprime(3) == 2
|
||||
assert prevprime(7) == 5
|
||||
assert prevprime(13) == 11
|
||||
assert prevprime(19) == 17
|
||||
assert prevprime(20) == 19
|
||||
|
||||
sieve.extend_to_no(9)
|
||||
assert sieve._list[-1] == 23
|
||||
|
||||
assert sieve._list[-1] < 31
|
||||
assert 31 in sieve
|
||||
|
||||
assert nextprime(90) == 97
|
||||
assert nextprime(10**40) == (10**40 + 121)
|
||||
primelist = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31,
|
||||
37, 41, 43, 47, 53, 59, 61, 67, 71, 73,
|
||||
79, 83, 89, 97, 101, 103, 107, 109, 113,
|
||||
127, 131, 137, 139, 149, 151, 157, 163,
|
||||
167, 173, 179, 181, 191, 193, 197, 199,
|
||||
211, 223, 227, 229, 233, 239, 241, 251,
|
||||
257, 263, 269, 271, 277, 281, 283, 293]
|
||||
for i in range(len(primelist) - 2):
|
||||
for j in range(2, len(primelist) - i):
|
||||
assert nextprime(primelist[i], j) == primelist[i + j]
|
||||
if 3 < i:
|
||||
assert nextprime(primelist[i] - 1, j) == primelist[i + j - 1]
|
||||
raises(ValueError, lambda: nextprime(2, 0))
|
||||
raises(ValueError, lambda: nextprime(2, -1))
|
||||
assert prevprime(97) == 89
|
||||
assert prevprime(10**40) == (10**40 - 17)
|
||||
|
||||
raises(ValueError, lambda: Sieve(0))
|
||||
raises(ValueError, lambda: Sieve(-1))
|
||||
for sieve_interval in [1, 10, 11, 1_000_000]:
|
||||
s = Sieve(sieve_interval=sieve_interval)
|
||||
for head in range(s._list[-1] + 1, (s._list[-1] + 1)**2, 2):
|
||||
for tail in range(head + 1, (s._list[-1] + 1)**2):
|
||||
A = list(s._primerange(head, tail))
|
||||
B = primelist[bisect(primelist, head):bisect_left(primelist, tail)]
|
||||
assert A == B
|
||||
for k in range(s._list[-1], primelist[-1] - 1, 2):
|
||||
s = Sieve(sieve_interval=sieve_interval)
|
||||
s.extend(k)
|
||||
assert list(s._list) == primelist[:bisect(primelist, k)]
|
||||
s.extend(primelist[-1])
|
||||
assert list(s._list) == primelist
|
||||
|
||||
assert list(sieve.primerange(10, 1)) == []
|
||||
assert list(sieve.primerange(5, 9)) == [5, 7]
|
||||
sieve._reset(prime=True)
|
||||
assert list(sieve.primerange(2, 13)) == [2, 3, 5, 7, 11]
|
||||
assert list(sieve.primerange(13)) == [2, 3, 5, 7, 11]
|
||||
assert list(sieve.primerange(8)) == [2, 3, 5, 7]
|
||||
assert list(sieve.primerange(-2)) == []
|
||||
assert list(sieve.primerange(29)) == [2, 3, 5, 7, 11, 13, 17, 19, 23]
|
||||
assert list(sieve.primerange(34)) == [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
|
||||
|
||||
assert list(sieve.totientrange(5, 15)) == [4, 2, 6, 4, 6, 4, 10, 4, 12, 6]
|
||||
sieve._reset(totient=True)
|
||||
assert list(sieve.totientrange(3, 13)) == [2, 2, 4, 2, 6, 4, 6, 4, 10, 4]
|
||||
assert list(sieve.totientrange(900, 1000)) == [totient(x) for x in range(900, 1000)]
|
||||
assert list(sieve.totientrange(0, 1)) == []
|
||||
assert list(sieve.totientrange(1, 2)) == [1]
|
||||
|
||||
assert list(sieve.mobiusrange(5, 15)) == [-1, 1, -1, 0, 0, 1, -1, 0, -1, 1]
|
||||
sieve._reset(mobius=True)
|
||||
assert list(sieve.mobiusrange(3, 13)) == [-1, 0, -1, 1, -1, 0, 0, 1, -1, 0]
|
||||
assert list(sieve.mobiusrange(1050, 1100)) == [mobius(x) for x in range(1050, 1100)]
|
||||
assert list(sieve.mobiusrange(0, 1)) == []
|
||||
assert list(sieve.mobiusrange(1, 2)) == [1]
|
||||
|
||||
assert list(primerange(10, 1)) == []
|
||||
assert list(primerange(2, 7)) == [2, 3, 5]
|
||||
assert list(primerange(2, 10)) == [2, 3, 5, 7]
|
||||
assert list(primerange(1050, 1100)) == [1051, 1061,
|
||||
1063, 1069, 1087, 1091, 1093, 1097]
|
||||
s = Sieve()
|
||||
for i in range(30, 2350, 376):
|
||||
for j in range(2, 5096, 1139):
|
||||
A = list(s.primerange(i, i + j))
|
||||
B = list(primerange(i, i + j))
|
||||
assert A == B
|
||||
s = Sieve()
|
||||
sieve._reset(prime=True)
|
||||
sieve.extend(13)
|
||||
for i in range(200):
|
||||
for j in range(i, 200):
|
||||
A = list(s.primerange(i, j))
|
||||
B = list(primerange(i, j))
|
||||
assert A == B
|
||||
sieve.extend(1000)
|
||||
for a, b in [(901, 1103), # a < 1000 < b < 1000**2
|
||||
(806, 1002007), # a < 1000 < 1000**2 < b
|
||||
(2000, 30001), # 1000 < a < b < 1000**2
|
||||
(100005, 1010001), # 1000 < a < 1000**2 < b
|
||||
(1003003, 1005000), # 1000**2 < a < b
|
||||
]:
|
||||
assert list(primerange(a, b)) == list(s.primerange(a, b))
|
||||
sieve._reset(prime=True)
|
||||
sieve.extend(100000)
|
||||
assert len(sieve._list) == len(set(sieve._list))
|
||||
s = Sieve()
|
||||
assert s[10] == 29
|
||||
|
||||
assert nextprime(2, 2) == 5
|
||||
|
||||
raises(ValueError, lambda: totient(0))
|
||||
|
||||
raises(ValueError, lambda: primorial(0))
|
||||
|
||||
assert mr(1, [2]) is False
|
||||
|
||||
func = lambda i: (i**2 + 1) % 51
|
||||
assert next(cycle_length(func, 4)) == (6, 3)
|
||||
assert list(cycle_length(func, 4, values=True)) == \
|
||||
[4, 17, 35, 2, 5, 26, 14, 44, 50, 2, 5, 26, 14]
|
||||
assert next(cycle_length(func, 4, nmax=5)) == (5, None)
|
||||
assert list(cycle_length(func, 4, nmax=5, values=True)) == \
|
||||
[4, 17, 35, 2, 5]
|
||||
sieve.extend(3000)
|
||||
assert nextprime(2968) == 2969
|
||||
assert prevprime(2930) == 2927
|
||||
raises(ValueError, lambda: prevprime(1))
|
||||
raises(ValueError, lambda: prevprime(-4))
|
||||
|
||||
|
||||
def test_randprime():
|
||||
assert randprime(10, 1) is None
|
||||
assert randprime(3, -3) is None
|
||||
assert randprime(2, 3) == 2
|
||||
assert randprime(1, 3) == 2
|
||||
assert randprime(3, 5) == 3
|
||||
raises(ValueError, lambda: randprime(-12, -2))
|
||||
raises(ValueError, lambda: randprime(-10, 0))
|
||||
raises(ValueError, lambda: randprime(20, 22))
|
||||
raises(ValueError, lambda: randprime(0, 2))
|
||||
raises(ValueError, lambda: randprime(1, 2))
|
||||
for a in [100, 300, 500, 250000]:
|
||||
for b in [100, 300, 500, 250000]:
|
||||
p = randprime(a, a + b)
|
||||
assert a <= p < (a + b) and isprime(p)
|
||||
|
||||
|
||||
def test_primorial():
|
||||
assert primorial(1) == 2
|
||||
assert primorial(1, nth=0) == 1
|
||||
assert primorial(2) == 6
|
||||
assert primorial(2, nth=0) == 2
|
||||
assert primorial(4, nth=0) == 6
|
||||
|
||||
|
||||
def test_search():
|
||||
assert 2 in sieve
|
||||
assert 2.1 not in sieve
|
||||
assert 1 not in sieve
|
||||
assert 2**1000 not in sieve
|
||||
raises(ValueError, lambda: sieve.search(1))
|
||||
|
||||
|
||||
def test_sieve_slice():
|
||||
assert sieve[5] == 11
|
||||
assert list(sieve[5:10]) == [sieve[x] for x in range(5, 10)]
|
||||
assert list(sieve[5:10:2]) == [sieve[x] for x in range(5, 10, 2)]
|
||||
assert list(sieve[1:5]) == [2, 3, 5, 7]
|
||||
raises(IndexError, lambda: sieve[:5])
|
||||
raises(IndexError, lambda: sieve[0])
|
||||
raises(IndexError, lambda: sieve[0:5])
|
||||
|
||||
def test_sieve_iter():
|
||||
values = []
|
||||
for value in sieve:
|
||||
if value > 7:
|
||||
break
|
||||
values.append(value)
|
||||
assert values == list(sieve[1:5])
|
||||
|
||||
|
||||
def test_sieve_repr():
|
||||
assert "sieve" in repr(sieve)
|
||||
assert "prime" in repr(sieve)
|
||||
|
||||
|
||||
def test_deprecated_ntheory_symbolic_functions():
|
||||
from sympy.testing.pytest import warns_deprecated_sympy
|
||||
|
||||
with warns_deprecated_sympy():
|
||||
assert primepi(0) == 0
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
from hypothesis import given
|
||||
from hypothesis import strategies as st
|
||||
from sympy import divisors
|
||||
from sympy.functions.combinatorial.numbers import divisor_sigma, totient
|
||||
from sympy.ntheory.primetest import is_square
|
||||
|
||||
|
||||
@given(n=st.integers(1, 10**10))
|
||||
def test_tau_hypothesis(n):
|
||||
div = divisors(n)
|
||||
tau_n = len(div)
|
||||
assert is_square(n) == (tau_n % 2 == 1)
|
||||
sigmas = [divisor_sigma(i) for i in div]
|
||||
totients = [totient(n // i) for i in div]
|
||||
mul = [a * b for a, b in zip(sigmas, totients)]
|
||||
assert n * tau_n == sum(mul)
|
||||
|
||||
|
||||
@given(n=st.integers(1, 10**10))
|
||||
def test_totient_hypothesis(n):
|
||||
assert totient(n) <= n
|
||||
div = divisors(n)
|
||||
totients = [totient(i) for i in div]
|
||||
assert n == sum(totients)
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
from sympy.ntheory.modular import crt, crt1, crt2, solve_congruence
|
||||
from sympy.testing.pytest import raises
|
||||
|
||||
|
||||
def test_crt():
|
||||
def mcrt(m, v, r, symmetric=False):
|
||||
assert crt(m, v, symmetric)[0] == r
|
||||
mm, e, s = crt1(m)
|
||||
assert crt2(m, v, mm, e, s, symmetric) == (r, mm)
|
||||
|
||||
mcrt([2, 3, 5], [0, 0, 0], 0)
|
||||
mcrt([2, 3, 5], [1, 1, 1], 1)
|
||||
|
||||
mcrt([2, 3, 5], [-1, -1, -1], -1, True)
|
||||
mcrt([2, 3, 5], [-1, -1, -1], 2*3*5 - 1, False)
|
||||
|
||||
assert crt([656, 350], [811, 133], symmetric=True) == (-56917, 114800)
|
||||
|
||||
|
||||
def test_modular():
|
||||
assert solve_congruence(*list(zip([3, 4, 2], [12, 35, 17]))) == (1719, 7140)
|
||||
assert solve_congruence(*list(zip([3, 4, 2], [12, 6, 17]))) is None
|
||||
assert solve_congruence(*list(zip([3, 4, 2], [13, 7, 17]))) == (172, 1547)
|
||||
assert solve_congruence(*list(zip([-10, -3, -15], [13, 7, 17]))) == (172, 1547)
|
||||
assert solve_congruence(*list(zip([-10, -3, 1, -15], [13, 7, 7, 17]))) is None
|
||||
assert solve_congruence(
|
||||
*list(zip([-10, -5, 2, -15], [13, 7, 7, 17]))) == (835, 1547)
|
||||
assert solve_congruence(
|
||||
*list(zip([-10, -5, 2, -15], [13, 7, 14, 17]))) == (2382, 3094)
|
||||
assert solve_congruence(
|
||||
*list(zip([-10, 2, 2, -15], [13, 7, 14, 17]))) == (2382, 3094)
|
||||
assert solve_congruence(*list(zip((1, 1, 2), (3, 2, 4)))) is None
|
||||
raises(
|
||||
ValueError, lambda: solve_congruence(*list(zip([3, 4, 2], [12.1, 35, 17]))))
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
from sympy.ntheory.multinomial import (binomial_coefficients, binomial_coefficients_list, multinomial_coefficients)
|
||||
from sympy.ntheory.multinomial import multinomial_coefficients_iterator
|
||||
|
||||
|
||||
def test_binomial_coefficients_list():
|
||||
assert binomial_coefficients_list(0) == [1]
|
||||
assert binomial_coefficients_list(1) == [1, 1]
|
||||
assert binomial_coefficients_list(2) == [1, 2, 1]
|
||||
assert binomial_coefficients_list(3) == [1, 3, 3, 1]
|
||||
assert binomial_coefficients_list(4) == [1, 4, 6, 4, 1]
|
||||
assert binomial_coefficients_list(5) == [1, 5, 10, 10, 5, 1]
|
||||
assert binomial_coefficients_list(6) == [1, 6, 15, 20, 15, 6, 1]
|
||||
|
||||
|
||||
def test_binomial_coefficients():
|
||||
for n in range(15):
|
||||
c = binomial_coefficients(n)
|
||||
l = [c[k] for k in sorted(c)]
|
||||
assert l == binomial_coefficients_list(n)
|
||||
|
||||
|
||||
def test_multinomial_coefficients():
|
||||
assert multinomial_coefficients(1, 1) == {(1,): 1}
|
||||
assert multinomial_coefficients(1, 2) == {(2,): 1}
|
||||
assert multinomial_coefficients(1, 3) == {(3,): 1}
|
||||
assert multinomial_coefficients(2, 0) == {(0, 0): 1}
|
||||
assert multinomial_coefficients(2, 1) == {(0, 1): 1, (1, 0): 1}
|
||||
assert multinomial_coefficients(2, 2) == {(2, 0): 1, (0, 2): 1, (1, 1): 2}
|
||||
assert multinomial_coefficients(2, 3) == {(3, 0): 1, (1, 2): 3, (0, 3): 1,
|
||||
(2, 1): 3}
|
||||
assert multinomial_coefficients(3, 1) == {(1, 0, 0): 1, (0, 1, 0): 1,
|
||||
(0, 0, 1): 1}
|
||||
assert multinomial_coefficients(3, 2) == {(0, 1, 1): 2, (0, 0, 2): 1,
|
||||
(1, 1, 0): 2, (0, 2, 0): 1, (1, 0, 1): 2, (2, 0, 0): 1}
|
||||
mc = multinomial_coefficients(3, 3)
|
||||
assert mc == {(2, 1, 0): 3, (0, 3, 0): 1,
|
||||
(1, 0, 2): 3, (0, 2, 1): 3, (0, 1, 2): 3, (3, 0, 0): 1,
|
||||
(2, 0, 1): 3, (1, 2, 0): 3, (1, 1, 1): 6, (0, 0, 3): 1}
|
||||
assert dict(multinomial_coefficients_iterator(2, 0)) == {(0, 0): 1}
|
||||
assert dict(
|
||||
multinomial_coefficients_iterator(2, 1)) == {(0, 1): 1, (1, 0): 1}
|
||||
assert dict(multinomial_coefficients_iterator(2, 2)) == \
|
||||
{(2, 0): 1, (0, 2): 1, (1, 1): 2}
|
||||
assert dict(multinomial_coefficients_iterator(3, 3)) == mc
|
||||
it = multinomial_coefficients_iterator(7, 2)
|
||||
assert [next(it) for i in range(4)] == \
|
||||
[((2, 0, 0, 0, 0, 0, 0), 1), ((1, 1, 0, 0, 0, 0, 0), 2),
|
||||
((0, 2, 0, 0, 0, 0, 0), 1), ((1, 0, 1, 0, 0, 0, 0), 2)]
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
from sympy.ntheory.partitions_ import npartitions, _partition_rec, _partition
|
||||
|
||||
|
||||
def test__partition_rec():
|
||||
A000041 = [1, 1, 2, 3, 5, 7, 11, 15, 22, 30, 42, 56, 77, 101, 135,
|
||||
176, 231, 297, 385, 490, 627, 792, 1002, 1255, 1575]
|
||||
for n, val in enumerate(A000041):
|
||||
assert _partition_rec(n) == val
|
||||
|
||||
|
||||
def test__partition():
|
||||
assert [_partition(k) for k in range(13)] == \
|
||||
[1, 1, 2, 3, 5, 7, 11, 15, 22, 30, 42, 56, 77]
|
||||
assert _partition(100) == 190569292
|
||||
assert _partition(200) == 3972999029388
|
||||
assert _partition(1000) == 24061467864032622473692149727991
|
||||
assert _partition(1001) == 25032297938763929621013218349796
|
||||
assert _partition(2000) == 4720819175619413888601432406799959512200344166
|
||||
assert _partition(10000) % 10**10 == 6916435144
|
||||
assert _partition(100000) % 10**10 == 9421098519
|
||||
assert _partition(10000000) % 10**10 == 7677288980
|
||||
|
||||
|
||||
def test_deprecated_ntheory_symbolic_functions():
|
||||
from sympy.testing.pytest import warns_deprecated_sympy
|
||||
|
||||
with warns_deprecated_sympy():
|
||||
assert npartitions(0) == 1
|
||||
|
|
@ -0,0 +1,235 @@
|
|||
from math import gcd
|
||||
|
||||
from sympy.ntheory.generate import Sieve, sieve
|
||||
from sympy.ntheory.primetest import (mr, _lucas_extrastrong_params, is_lucas_prp, is_square,
|
||||
is_strong_lucas_prp, is_extra_strong_lucas_prp,
|
||||
proth_test, isprime, is_euler_pseudoprime,
|
||||
is_gaussian_prime, is_fermat_pseudoprime, is_euler_jacobi_pseudoprime,
|
||||
MERSENNE_PRIME_EXPONENTS, _lucas_lehmer_primality_test,
|
||||
is_mersenne_prime)
|
||||
|
||||
from sympy.testing.pytest import slow, raises
|
||||
from sympy.core.numbers import I, Float
|
||||
|
||||
|
||||
def test_is_fermat_pseudoprime():
|
||||
assert is_fermat_pseudoprime(5, 1)
|
||||
assert is_fermat_pseudoprime(9, 1)
|
||||
|
||||
|
||||
def test_euler_pseudoprimes():
|
||||
assert is_euler_pseudoprime(13, 1)
|
||||
assert is_euler_pseudoprime(15, 1)
|
||||
assert is_euler_pseudoprime(17, 6)
|
||||
assert is_euler_pseudoprime(101, 7)
|
||||
assert is_euler_pseudoprime(1009, 10)
|
||||
assert is_euler_pseudoprime(11287, 41)
|
||||
|
||||
raises(ValueError, lambda: is_euler_pseudoprime(0, 4))
|
||||
raises(ValueError, lambda: is_euler_pseudoprime(3, 0))
|
||||
raises(ValueError, lambda: is_euler_pseudoprime(15, 6))
|
||||
|
||||
# A006970
|
||||
euler_prp = [341, 561, 1105, 1729, 1905, 2047, 2465, 3277,
|
||||
4033, 4681, 5461, 6601, 8321, 8481, 10261, 10585]
|
||||
for p in euler_prp:
|
||||
assert is_euler_pseudoprime(p, 2)
|
||||
|
||||
# A048950
|
||||
euler_prp = [121, 703, 1729, 1891, 2821, 3281, 7381, 8401, 8911, 10585,
|
||||
12403, 15457, 15841, 16531, 18721, 19345, 23521, 24661, 28009]
|
||||
for p in euler_prp:
|
||||
assert is_euler_pseudoprime(p, 3)
|
||||
|
||||
# A033181
|
||||
absolute_euler_prp = [1729, 2465, 15841, 41041, 46657, 75361,
|
||||
162401, 172081, 399001, 449065, 488881]
|
||||
for p in absolute_euler_prp:
|
||||
for a in range(2, p):
|
||||
if gcd(a, p) != 1:
|
||||
continue
|
||||
assert is_euler_pseudoprime(p, a)
|
||||
|
||||
|
||||
def test_is_euler_jacobi_pseudoprime():
|
||||
assert is_euler_jacobi_pseudoprime(11, 1)
|
||||
assert is_euler_jacobi_pseudoprime(15, 1)
|
||||
|
||||
|
||||
def test_lucas_extrastrong_params():
|
||||
assert _lucas_extrastrong_params(3) == (5, 3, 1)
|
||||
assert _lucas_extrastrong_params(5) == (12, 4, 1)
|
||||
assert _lucas_extrastrong_params(7) == (5, 3, 1)
|
||||
assert _lucas_extrastrong_params(9) == (0, 0, 0)
|
||||
assert _lucas_extrastrong_params(11) == (21, 5, 1)
|
||||
assert _lucas_extrastrong_params(59) == (32, 6, 1)
|
||||
assert _lucas_extrastrong_params(479) == (117, 11, 1)
|
||||
|
||||
|
||||
def test_is_extra_strong_lucas_prp():
|
||||
assert is_extra_strong_lucas_prp(4) == False
|
||||
assert is_extra_strong_lucas_prp(989) == True
|
||||
assert is_extra_strong_lucas_prp(10877) == True
|
||||
assert is_extra_strong_lucas_prp(9) == False
|
||||
assert is_extra_strong_lucas_prp(16) == False
|
||||
assert is_extra_strong_lucas_prp(169) == False
|
||||
|
||||
@slow
|
||||
def test_prps():
|
||||
oddcomposites = [n for n in range(1, 10**5) if
|
||||
n % 2 and not isprime(n)]
|
||||
# A checksum would be better.
|
||||
assert sum(oddcomposites) == 2045603465
|
||||
assert [n for n in oddcomposites if mr(n, [2])] == [
|
||||
2047, 3277, 4033, 4681, 8321, 15841, 29341, 42799, 49141,
|
||||
52633, 65281, 74665, 80581, 85489, 88357, 90751]
|
||||
assert [n for n in oddcomposites if mr(n, [3])] == [
|
||||
121, 703, 1891, 3281, 8401, 8911, 10585, 12403, 16531,
|
||||
18721, 19345, 23521, 31621, 44287, 47197, 55969, 63139,
|
||||
74593, 79003, 82513, 87913, 88573, 97567]
|
||||
assert [n for n in oddcomposites if mr(n, [325])] == [
|
||||
9, 25, 27, 49, 65, 81, 325, 341, 343, 697, 1141, 2059,
|
||||
2149, 3097, 3537, 4033, 4681, 4941, 5833, 6517, 7987, 8911,
|
||||
12403, 12913, 15043, 16021, 20017, 22261, 23221, 24649,
|
||||
24929, 31841, 35371, 38503, 43213, 44173, 47197, 50041,
|
||||
55909, 56033, 58969, 59089, 61337, 65441, 68823, 72641,
|
||||
76793, 78409, 85879]
|
||||
assert not any(mr(n, [9345883071009581737]) for n in oddcomposites)
|
||||
assert [n for n in oddcomposites if is_lucas_prp(n)] == [
|
||||
323, 377, 1159, 1829, 3827, 5459, 5777, 9071, 9179, 10877,
|
||||
11419, 11663, 13919, 14839, 16109, 16211, 18407, 18971,
|
||||
19043, 22499, 23407, 24569, 25199, 25877, 26069, 27323,
|
||||
32759, 34943, 35207, 39059, 39203, 39689, 40309, 44099,
|
||||
46979, 47879, 50183, 51983, 53663, 56279, 58519, 60377,
|
||||
63881, 69509, 72389, 73919, 75077, 77219, 79547, 79799,
|
||||
82983, 84419, 86063, 90287, 94667, 97019, 97439]
|
||||
assert [n for n in oddcomposites if is_strong_lucas_prp(n)] == [
|
||||
5459, 5777, 10877, 16109, 18971, 22499, 24569, 25199, 40309,
|
||||
58519, 75077, 97439]
|
||||
assert [n for n in oddcomposites if is_extra_strong_lucas_prp(n)
|
||||
] == [
|
||||
989, 3239, 5777, 10877, 27971, 29681, 30739, 31631, 39059,
|
||||
72389, 73919, 75077]
|
||||
|
||||
|
||||
def test_proth_test():
|
||||
# Proth number
|
||||
A080075 = [3, 5, 9, 13, 17, 25, 33, 41, 49, 57, 65,
|
||||
81, 97, 113, 129, 145, 161, 177, 193]
|
||||
# Proth prime
|
||||
A080076 = [3, 5, 13, 17, 41, 97, 113, 193]
|
||||
|
||||
for n in range(200):
|
||||
if n in A080075:
|
||||
assert proth_test(n) == (n in A080076)
|
||||
else:
|
||||
raises(ValueError, lambda: proth_test(n))
|
||||
|
||||
|
||||
def test_lucas_lehmer_primality_test():
|
||||
for p in sieve.primerange(3, 100):
|
||||
assert _lucas_lehmer_primality_test(p) == (p in MERSENNE_PRIME_EXPONENTS)
|
||||
|
||||
|
||||
def test_is_mersenne_prime():
|
||||
assert is_mersenne_prime(-3) is False
|
||||
assert is_mersenne_prime(3) is True
|
||||
assert is_mersenne_prime(10) is False
|
||||
assert is_mersenne_prime(127) is True
|
||||
assert is_mersenne_prime(511) is False
|
||||
assert is_mersenne_prime(131071) is True
|
||||
assert is_mersenne_prime(2147483647) is True
|
||||
|
||||
|
||||
def test_isprime():
|
||||
s = Sieve()
|
||||
s.extend(100000)
|
||||
ps = set(s.primerange(2, 100001))
|
||||
for n in range(100001):
|
||||
# if (n in ps) != isprime(n): print n
|
||||
assert (n in ps) == isprime(n)
|
||||
assert isprime(179424673)
|
||||
assert isprime(20678048681)
|
||||
assert isprime(1968188556461)
|
||||
assert isprime(2614941710599)
|
||||
assert isprime(65635624165761929287)
|
||||
assert isprime(1162566711635022452267983)
|
||||
assert isprime(77123077103005189615466924501)
|
||||
assert isprime(3991617775553178702574451996736229)
|
||||
assert isprime(273952953553395851092382714516720001799)
|
||||
assert isprime(int('''
|
||||
531137992816767098689588206552468627329593117727031923199444138200403\
|
||||
559860852242739162502265229285668889329486246501015346579337652707239\
|
||||
409519978766587351943831270835393219031728127'''))
|
||||
|
||||
# Some Mersenne primes
|
||||
assert isprime(2**61 - 1)
|
||||
assert isprime(2**89 - 1)
|
||||
assert isprime(2**607 - 1)
|
||||
# (but not all Mersenne's are primes
|
||||
assert not isprime(2**601 - 1)
|
||||
|
||||
# pseudoprimes
|
||||
#-------------
|
||||
# to some small bases
|
||||
assert not isprime(2152302898747)
|
||||
assert not isprime(3474749660383)
|
||||
assert not isprime(341550071728321)
|
||||
assert not isprime(3825123056546413051)
|
||||
# passes the base set [2, 3, 7, 61, 24251]
|
||||
assert not isprime(9188353522314541)
|
||||
# large examples
|
||||
assert not isprime(877777777777777777777777)
|
||||
# conjectured psi_12 given at http://mathworld.wolfram.com/StrongPseudoprime.html
|
||||
assert not isprime(318665857834031151167461)
|
||||
# conjectured psi_17 given at http://mathworld.wolfram.com/StrongPseudoprime.html
|
||||
assert not isprime(564132928021909221014087501701)
|
||||
# Arnault's 1993 number; a factor of it is
|
||||
# 400958216639499605418306452084546853005188166041132508774506\
|
||||
# 204738003217070119624271622319159721973358216316508535816696\
|
||||
# 9145233813917169287527980445796800452592031836601
|
||||
assert not isprime(int('''
|
||||
803837457453639491257079614341942108138837688287558145837488917522297\
|
||||
427376533365218650233616396004545791504202360320876656996676098728404\
|
||||
396540823292873879185086916685732826776177102938969773947016708230428\
|
||||
687109997439976544144845341155872450633409279022275296229414984230688\
|
||||
1685404326457534018329786111298960644845216191652872597534901'''))
|
||||
# Arnault's 1995 number; can be factored as
|
||||
# p1*(313*(p1 - 1) + 1)*(353*(p1 - 1) + 1) where p1 is
|
||||
# 296744956686855105501541746429053327307719917998530433509950\
|
||||
# 755312768387531717701995942385964281211880336647542183455624\
|
||||
# 93168782883
|
||||
assert not isprime(int('''
|
||||
288714823805077121267142959713039399197760945927972270092651602419743\
|
||||
230379915273311632898314463922594197780311092934965557841894944174093\
|
||||
380561511397999942154241693397290542371100275104208013496673175515285\
|
||||
922696291677532547504444585610194940420003990443211677661994962953925\
|
||||
045269871932907037356403227370127845389912612030924484149472897688540\
|
||||
6024976768122077071687938121709811322297802059565867'''))
|
||||
sieve.extend(3000)
|
||||
assert isprime(2819)
|
||||
assert not isprime(2931)
|
||||
raises(ValueError, lambda: isprime(2.0))
|
||||
raises(ValueError, lambda: isprime(Float(2)))
|
||||
|
||||
|
||||
def test_is_square():
|
||||
assert [i for i in range(25) if is_square(i)] == [0, 1, 4, 9, 16]
|
||||
|
||||
# issue #17044
|
||||
assert not is_square(60 ** 3)
|
||||
assert not is_square(60 ** 5)
|
||||
assert not is_square(84 ** 7)
|
||||
assert not is_square(105 ** 9)
|
||||
assert not is_square(120 ** 3)
|
||||
|
||||
def test_is_gaussianprime():
|
||||
assert is_gaussian_prime(7*I)
|
||||
assert is_gaussian_prime(7)
|
||||
assert is_gaussian_prime(2 + 3*I)
|
||||
assert not is_gaussian_prime(2 + 2*I)
|
||||
|
||||
|
||||
def test_issue_27145():
|
||||
#https://github.com/sympy/sympy/issues/27145
|
||||
assert [mr(i,[2,3,5,7]) for i in (1, 2, 6)] == [False, True, False]
|
||||
110
venv/lib/python3.12/site-packages/sympy/ntheory/tests/test_qs.py
Normal file
110
venv/lib/python3.12/site-packages/sympy/ntheory/tests/test_qs.py
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import math
|
||||
from sympy.core.random import _randint
|
||||
from sympy.ntheory import qs, qs_factor
|
||||
from sympy.ntheory.qs import SievePolynomial, _generate_factor_base, \
|
||||
_generate_polynomial, \
|
||||
_gen_sieve_array, _check_smoothness, _trial_division_stage, _find_factor
|
||||
from sympy.testing.pytest import slow
|
||||
|
||||
|
||||
@slow
|
||||
def test_qs_1():
|
||||
assert qs(10009202107, 100, 10000) == {100043, 100049}
|
||||
assert qs(211107295182713951054568361, 1000, 10000) == \
|
||||
{13791315212531, 15307263442931}
|
||||
assert qs(980835832582657*990377764891511, 2000, 10000) == \
|
||||
{980835832582657, 990377764891511}
|
||||
assert qs(18640889198609*20991129234731, 1000, 50000) == \
|
||||
{18640889198609, 20991129234731}
|
||||
|
||||
|
||||
def test_qs_2() -> None:
|
||||
n = 10009202107
|
||||
M = 50
|
||||
sieve_poly = SievePolynomial(10, 80, n)
|
||||
assert sieve_poly.eval_v(10) == sieve_poly.eval_u(10)**2 - n == -10009169707
|
||||
assert sieve_poly.eval_v(5) == sieve_poly.eval_u(5)**2 - n == -10009185207
|
||||
|
||||
idx_1000, idx_5000, factor_base = _generate_factor_base(2000, n)
|
||||
assert idx_1000 == 82
|
||||
assert [factor_base[i].prime for i in range(15)] == \
|
||||
[2, 3, 7, 11, 17, 19, 29, 31, 43, 59, 61, 67, 71, 73, 79]
|
||||
assert [factor_base[i].tmem_p for i in range(15)] == \
|
||||
[1, 1, 3, 5, 3, 6, 6, 14, 1, 16, 24, 22, 18, 22, 15]
|
||||
assert [factor_base[i].log_p for i in range(5)] == \
|
||||
[710, 1125, 1993, 2455, 2901]
|
||||
|
||||
it = _generate_polynomial(
|
||||
n, M, factor_base, idx_1000, idx_5000, _randint(0))
|
||||
g = next(it)
|
||||
assert g.a == 1133107
|
||||
assert g.b == 682543
|
||||
assert [factor_base[i].soln1 for i in range(15)] == \
|
||||
[0, 0, 3, 7, 13, 0, 8, 19, 9, 43, 27, 25, 63, 29, 19]
|
||||
assert [factor_base[i].soln2 for i in range(15)] == \
|
||||
[0, 1, 1, 3, 12, 16, 15, 6, 15, 1, 56, 55, 61, 58, 16]
|
||||
assert [factor_base[i].b_ainv for i in range(5)] == \
|
||||
[[0, 0], [0, 2], [3, 0], [3, 9], [13, 13]]
|
||||
|
||||
g_1 = next(it)
|
||||
assert g_1.a == 1133107
|
||||
assert g_1.b == 136765
|
||||
|
||||
sieve_array = _gen_sieve_array(M, factor_base)
|
||||
assert sieve_array[0:5] == [8424, 13603, 1835, 5335, 710]
|
||||
|
||||
assert _check_smoothness(9645, factor_base) == (36028797018963972, 5)
|
||||
assert _check_smoothness(210313, factor_base) == (20992, 1)
|
||||
|
||||
partial_relations: dict[int, tuple[int, int]] = {}
|
||||
smooth_relation, proper_factor = _trial_division_stage(
|
||||
n, M, factor_base, sieve_array, sieve_poly, partial_relations,
|
||||
ERROR_TERM=25*2**10)
|
||||
|
||||
assert partial_relations == {
|
||||
8699: (440, -10009008507, 75557863761098695507973),
|
||||
166741: (490, -10008962007, 524341),
|
||||
131449: (530, -10008921207, 664613997892457936451903530140172325),
|
||||
6653: (550, -10008899607, 19342813113834066795307021)
|
||||
}
|
||||
assert [smooth_relation[i][0] for i in range(5)] == [
|
||||
-250, 1064469, 72819, 231957, 44167]
|
||||
assert [smooth_relation[i][1] for i in range(5)] == [
|
||||
-10009139607, 1133094251961, 5302606761, 53804049849, 1950723889]
|
||||
assert smooth_relation[0][2] == 89213869829863962596973701078031812362502145
|
||||
assert proper_factor == set()
|
||||
|
||||
|
||||
def test_qs_3():
|
||||
N = 1817
|
||||
smooth_relations = [
|
||||
(2455024, 637, 8),
|
||||
(-27993000, 81536, 10),
|
||||
(11461840, 12544, 0),
|
||||
(149, 20384, 10),
|
||||
(-31138074, 19208, 2)
|
||||
]
|
||||
assert next(_find_factor(N, smooth_relations, 4)) == 23
|
||||
|
||||
|
||||
def test_qs_4():
|
||||
N = 10007**2 * 10009 * 10037**3 * 10039
|
||||
for factor in qs(N, 1000, 2000):
|
||||
assert N % factor == 0
|
||||
N //= factor
|
||||
|
||||
|
||||
def test_qs_factor():
|
||||
assert qs_factor(1009 * 100003, 2000, 10000) == {1009: 1, 100003: 1}
|
||||
n = 1009**2 * 2003**2*30011*400009
|
||||
factors = qs_factor(n, 2000, 10000)
|
||||
assert len(factors) > 1
|
||||
assert math.prod(p**e for p, e in factors.items()) == n
|
||||
|
||||
|
||||
def test_issue_27616():
|
||||
#https://github.com/sympy/sympy/issues/27616
|
||||
N = 9804659461513846513 + 1
|
||||
assert qs(N, 5000, 20000) is not None
|
||||
|
|
@ -0,0 +1,349 @@
|
|||
from collections import defaultdict
|
||||
from sympy.core.containers import Tuple
|
||||
from sympy.core.singleton import S
|
||||
from sympy.core.symbol import (Dummy, Symbol)
|
||||
from sympy.functions.combinatorial.numbers import totient
|
||||
from sympy.ntheory import n_order, is_primitive_root, is_quad_residue, \
|
||||
legendre_symbol, jacobi_symbol, primerange, sqrt_mod, \
|
||||
primitive_root, quadratic_residues, is_nthpow_residue, nthroot_mod, \
|
||||
sqrt_mod_iter, mobius, discrete_log, quadratic_congruence, \
|
||||
polynomial_congruence, sieve
|
||||
from sympy.ntheory.residue_ntheory import _primitive_root_prime_iter, \
|
||||
_primitive_root_prime_power_iter, _primitive_root_prime_power2_iter, \
|
||||
_nthroot_mod_prime_power, _discrete_log_trial_mul, _discrete_log_shanks_steps, \
|
||||
_discrete_log_pollard_rho, _discrete_log_index_calculus, _discrete_log_pohlig_hellman, \
|
||||
_binomial_mod_prime_power, binomial_mod
|
||||
from sympy.polys.domains import ZZ
|
||||
from sympy.testing.pytest import raises
|
||||
from sympy.core.random import randint, choice
|
||||
|
||||
|
||||
def test_residue():
|
||||
assert n_order(2, 13) == 12
|
||||
assert [n_order(a, 7) for a in range(1, 7)] == \
|
||||
[1, 3, 6, 3, 6, 2]
|
||||
assert n_order(5, 17) == 16
|
||||
assert n_order(17, 11) == n_order(6, 11)
|
||||
assert n_order(101, 119) == 6
|
||||
assert n_order(11, (10**50 + 151)**2) == 10000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000022650
|
||||
raises(ValueError, lambda: n_order(6, 9))
|
||||
|
||||
assert is_primitive_root(2, 7) is False
|
||||
assert is_primitive_root(3, 8) is False
|
||||
assert is_primitive_root(11, 14) is False
|
||||
assert is_primitive_root(12, 17) == is_primitive_root(29, 17)
|
||||
raises(ValueError, lambda: is_primitive_root(3, 6))
|
||||
|
||||
for p in primerange(3, 100):
|
||||
li = list(_primitive_root_prime_iter(p))
|
||||
assert li[0] == min(li)
|
||||
for g in li:
|
||||
assert n_order(g, p) == p - 1
|
||||
assert len(li) == totient(totient(p))
|
||||
for e in range(1, 4):
|
||||
li_power = list(_primitive_root_prime_power_iter(p, e))
|
||||
li_power2 = list(_primitive_root_prime_power2_iter(p, e))
|
||||
assert len(li_power) == len(li_power2) == totient(totient(p**e))
|
||||
assert primitive_root(97) == 5
|
||||
assert n_order(primitive_root(97, False), 97) == totient(97)
|
||||
assert primitive_root(97**2) == 5
|
||||
assert n_order(primitive_root(97**2, False), 97**2) == totient(97**2)
|
||||
assert primitive_root(40487) == 5
|
||||
assert n_order(primitive_root(40487, False), 40487) == totient(40487)
|
||||
# note that primitive_root(40487) + 40487 = 40492 is a primitive root
|
||||
# of 40487**2, but it is not the smallest
|
||||
assert primitive_root(40487**2) == 10
|
||||
assert n_order(primitive_root(40487**2, False), 40487**2) == totient(40487**2)
|
||||
assert primitive_root(82) == 7
|
||||
assert n_order(primitive_root(82, False), 82) == totient(82)
|
||||
p = 10**50 + 151
|
||||
assert primitive_root(p) == 11
|
||||
assert n_order(primitive_root(p, False), p) == totient(p)
|
||||
assert primitive_root(2*p) == 11
|
||||
assert n_order(primitive_root(2*p, False), 2*p) == totient(2*p)
|
||||
assert primitive_root(p**2) == 11
|
||||
assert n_order(primitive_root(p**2, False), p**2) == totient(p**2)
|
||||
assert primitive_root(4 * 11) is None and primitive_root(4 * 11, False) is None
|
||||
assert primitive_root(15) is None and primitive_root(15, False) is None
|
||||
raises(ValueError, lambda: primitive_root(-3))
|
||||
|
||||
assert is_quad_residue(3, 7) is False
|
||||
assert is_quad_residue(10, 13) is True
|
||||
assert is_quad_residue(12364, 139) == is_quad_residue(12364 % 139, 139)
|
||||
assert is_quad_residue(207, 251) is True
|
||||
assert is_quad_residue(0, 1) is True
|
||||
assert is_quad_residue(1, 1) is True
|
||||
assert is_quad_residue(0, 2) == is_quad_residue(1, 2) is True
|
||||
assert is_quad_residue(1, 4) is True
|
||||
assert is_quad_residue(2, 27) is False
|
||||
assert is_quad_residue(13122380800, 13604889600) is True
|
||||
assert [j for j in range(14) if is_quad_residue(j, 14)] == \
|
||||
[0, 1, 2, 4, 7, 8, 9, 11]
|
||||
raises(ValueError, lambda: is_quad_residue(1.1, 2))
|
||||
raises(ValueError, lambda: is_quad_residue(2, 0))
|
||||
|
||||
assert quadratic_residues(S.One) == [0]
|
||||
assert quadratic_residues(1) == [0]
|
||||
assert quadratic_residues(12) == [0, 1, 4, 9]
|
||||
assert quadratic_residues(13) == [0, 1, 3, 4, 9, 10, 12]
|
||||
assert [len(quadratic_residues(i)) for i in range(1, 20)] == \
|
||||
[1, 2, 2, 2, 3, 4, 4, 3, 4, 6, 6, 4, 7, 8, 6, 4, 9, 8, 10]
|
||||
|
||||
assert list(sqrt_mod_iter(6, 2)) == [0]
|
||||
assert sqrt_mod(3, 13) == 4
|
||||
assert sqrt_mod(3, -13) == 4
|
||||
assert sqrt_mod(6, 23) == 11
|
||||
assert sqrt_mod(345, 690) == 345
|
||||
assert sqrt_mod(67, 101) == None
|
||||
assert sqrt_mod(1020, 104729) == None
|
||||
|
||||
for p in range(3, 100):
|
||||
d = defaultdict(list)
|
||||
for i in range(p):
|
||||
d[pow(i, 2, p)].append(i)
|
||||
for i in range(1, p):
|
||||
it = sqrt_mod_iter(i, p)
|
||||
v = sqrt_mod(i, p, True)
|
||||
if v:
|
||||
v = sorted(v)
|
||||
assert d[i] == v
|
||||
else:
|
||||
assert not d[i]
|
||||
|
||||
assert sqrt_mod(9, 27, True) == [3, 6, 12, 15, 21, 24]
|
||||
assert sqrt_mod(9, 81, True) == [3, 24, 30, 51, 57, 78]
|
||||
assert sqrt_mod(9, 3**5, True) == [3, 78, 84, 159, 165, 240]
|
||||
assert sqrt_mod(81, 3**4, True) == [0, 9, 18, 27, 36, 45, 54, 63, 72]
|
||||
assert sqrt_mod(81, 3**5, True) == [9, 18, 36, 45, 63, 72, 90, 99, 117,\
|
||||
126, 144, 153, 171, 180, 198, 207, 225, 234]
|
||||
assert sqrt_mod(81, 3**6, True) == [9, 72, 90, 153, 171, 234, 252, 315,\
|
||||
333, 396, 414, 477, 495, 558, 576, 639, 657, 720]
|
||||
assert sqrt_mod(81, 3**7, True) == [9, 234, 252, 477, 495, 720, 738, 963,\
|
||||
981, 1206, 1224, 1449, 1467, 1692, 1710, 1935, 1953, 2178]
|
||||
|
||||
for a, p in [(26214400, 32768000000), (26214400, 16384000000),
|
||||
(262144, 1048576), (87169610025, 163443018796875),
|
||||
(22315420166400, 167365651248000000)]:
|
||||
assert pow(sqrt_mod(a, p), 2, p) == a
|
||||
|
||||
n = 70
|
||||
a, p = 5**2*3**n*2**n, 5**6*3**(n+1)*2**(n+2)
|
||||
it = sqrt_mod_iter(a, p)
|
||||
for i in range(10):
|
||||
assert pow(next(it), 2, p) == a
|
||||
a, p = 5**2*3**n*2**n, 5**6*3**(n+1)*2**(n+3)
|
||||
it = sqrt_mod_iter(a, p)
|
||||
for i in range(2):
|
||||
assert pow(next(it), 2, p) == a
|
||||
n = 100
|
||||
a, p = 5**2*3**n*2**n, 5**6*3**(n+1)*2**(n+1)
|
||||
it = sqrt_mod_iter(a, p)
|
||||
for i in range(2):
|
||||
assert pow(next(it), 2, p) == a
|
||||
|
||||
assert type(next(sqrt_mod_iter(9, 27))) is int
|
||||
assert type(next(sqrt_mod_iter(9, 27, ZZ))) is type(ZZ(1))
|
||||
assert type(next(sqrt_mod_iter(1, 7, ZZ))) is type(ZZ(1))
|
||||
|
||||
assert is_nthpow_residue(2, 1, 5)
|
||||
|
||||
#issue 10816
|
||||
assert is_nthpow_residue(1, 0, 1) is False
|
||||
assert is_nthpow_residue(1, 0, 2) is True
|
||||
assert is_nthpow_residue(3, 0, 2) is True
|
||||
assert is_nthpow_residue(0, 1, 8) is True
|
||||
assert is_nthpow_residue(2, 3, 2) is True
|
||||
assert is_nthpow_residue(2, 3, 9) is False
|
||||
assert is_nthpow_residue(3, 5, 30) is True
|
||||
assert is_nthpow_residue(21, 11, 20) is True
|
||||
assert is_nthpow_residue(7, 10, 20) is False
|
||||
assert is_nthpow_residue(5, 10, 20) is True
|
||||
assert is_nthpow_residue(3, 10, 48) is False
|
||||
assert is_nthpow_residue(1, 10, 40) is True
|
||||
assert is_nthpow_residue(3, 10, 24) is False
|
||||
assert is_nthpow_residue(1, 10, 24) is True
|
||||
assert is_nthpow_residue(3, 10, 24) is False
|
||||
assert is_nthpow_residue(2, 10, 48) is False
|
||||
assert is_nthpow_residue(81, 3, 972) is False
|
||||
assert is_nthpow_residue(243, 5, 5103) is True
|
||||
assert is_nthpow_residue(243, 3, 1240029) is False
|
||||
assert is_nthpow_residue(36010, 8, 87382) is True
|
||||
assert is_nthpow_residue(28552, 6, 2218) is True
|
||||
assert is_nthpow_residue(92712, 9, 50026) is True
|
||||
x = {pow(i, 56, 1024) for i in range(1024)}
|
||||
assert {a for a in range(1024) if is_nthpow_residue(a, 56, 1024)} == x
|
||||
x = { pow(i, 256, 2048) for i in range(2048)}
|
||||
assert {a for a in range(2048) if is_nthpow_residue(a, 256, 2048)} == x
|
||||
x = { pow(i, 11, 324000) for i in range(1000)}
|
||||
assert [ is_nthpow_residue(a, 11, 324000) for a in x]
|
||||
x = { pow(i, 17, 22217575536) for i in range(1000)}
|
||||
assert [ is_nthpow_residue(a, 17, 22217575536) for a in x]
|
||||
assert is_nthpow_residue(676, 3, 5364)
|
||||
assert is_nthpow_residue(9, 12, 36)
|
||||
assert is_nthpow_residue(32, 10, 41)
|
||||
assert is_nthpow_residue(4, 2, 64)
|
||||
assert is_nthpow_residue(31, 4, 41)
|
||||
assert not is_nthpow_residue(2, 2, 5)
|
||||
assert is_nthpow_residue(8547, 12, 10007)
|
||||
assert is_nthpow_residue(Dummy(even=True) + 3, 3, 2) == True
|
||||
# _nthroot_mod_prime_power
|
||||
for p in primerange(2, 10):
|
||||
for a in range(3):
|
||||
for n in range(3, 5):
|
||||
ans = _nthroot_mod_prime_power(a, n, p, 1)
|
||||
assert isinstance(ans, list)
|
||||
if len(ans) == 0:
|
||||
for b in range(p):
|
||||
assert pow(b, n, p) != a % p
|
||||
for k in range(2, 10):
|
||||
assert _nthroot_mod_prime_power(a, n, p, k) == []
|
||||
else:
|
||||
for b in range(p):
|
||||
pred = pow(b, n, p) == a % p
|
||||
assert not(pred ^ (b in ans))
|
||||
for k in range(2, 10):
|
||||
ans = _nthroot_mod_prime_power(a, n, p, k)
|
||||
if not ans:
|
||||
break
|
||||
for b in ans:
|
||||
assert pow(b, n , p**k) == a
|
||||
|
||||
assert nthroot_mod(Dummy(odd=True), 3, 2) == 1
|
||||
assert nthroot_mod(29, 31, 74) == 45
|
||||
assert nthroot_mod(1801, 11, 2663) == 44
|
||||
for a, q, p in [(51922, 2, 203017), (43, 3, 109), (1801, 11, 2663),
|
||||
(26118163, 1303, 33333347), (1499, 7, 2663), (595, 6, 2663),
|
||||
(1714, 12, 2663), (28477, 9, 33343)]:
|
||||
r = nthroot_mod(a, q, p)
|
||||
assert pow(r, q, p) == a
|
||||
assert nthroot_mod(11, 3, 109) is None
|
||||
assert nthroot_mod(16, 5, 36, True) == [4, 22]
|
||||
assert nthroot_mod(9, 16, 36, True) == [3, 9, 15, 21, 27, 33]
|
||||
assert nthroot_mod(4, 3, 3249000) is None
|
||||
assert nthroot_mod(36010, 8, 87382, True) == [40208, 47174]
|
||||
assert nthroot_mod(0, 12, 37, True) == [0]
|
||||
assert nthroot_mod(0, 7, 100, True) == [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
|
||||
assert nthroot_mod(4, 4, 27, True) == [5, 22]
|
||||
assert nthroot_mod(4, 4, 121, True) == [19, 102]
|
||||
assert nthroot_mod(2, 3, 7, True) == []
|
||||
for p in range(1, 20):
|
||||
for a in range(p):
|
||||
for n in range(1, p):
|
||||
ans = nthroot_mod(a, n, p, True)
|
||||
assert isinstance(ans, list)
|
||||
for b in range(p):
|
||||
pred = pow(b, n, p) == a
|
||||
assert not(pred ^ (b in ans))
|
||||
ans2 = nthroot_mod(a, n, p, False)
|
||||
if ans2 is None:
|
||||
assert ans == []
|
||||
else:
|
||||
assert ans2 in ans
|
||||
|
||||
x = Symbol('x', positive=True)
|
||||
i = Symbol('i', integer=True)
|
||||
assert _discrete_log_trial_mul(587, 2**7, 2) == 7
|
||||
assert _discrete_log_trial_mul(941, 7**18, 7) == 18
|
||||
assert _discrete_log_trial_mul(389, 3**81, 3) == 81
|
||||
assert _discrete_log_trial_mul(191, 19**123, 19) == 123
|
||||
assert _discrete_log_shanks_steps(442879, 7**2, 7) == 2
|
||||
assert _discrete_log_shanks_steps(874323, 5**19, 5) == 19
|
||||
assert _discrete_log_shanks_steps(6876342, 7**71, 7) == 71
|
||||
assert _discrete_log_shanks_steps(2456747, 3**321, 3) == 321
|
||||
assert _discrete_log_pollard_rho(6013199, 2**6, 2, rseed=0) == 6
|
||||
assert _discrete_log_pollard_rho(6138719, 2**19, 2, rseed=0) == 19
|
||||
assert _discrete_log_pollard_rho(36721943, 2**40, 2, rseed=0) == 40
|
||||
assert _discrete_log_pollard_rho(24567899, 3**333, 3, rseed=0) == 333
|
||||
raises(ValueError, lambda: _discrete_log_pollard_rho(11, 7, 31, rseed=0))
|
||||
raises(ValueError, lambda: _discrete_log_pollard_rho(227, 3**7, 5, rseed=0))
|
||||
assert _discrete_log_index_calculus(983, 948, 2, 491) == 183
|
||||
assert _discrete_log_index_calculus(633383, 21794, 2, 316691) == 68048
|
||||
assert _discrete_log_index_calculus(941762639, 68822582, 2, 470881319) == 338029275
|
||||
assert _discrete_log_index_calculus(999231337607, 888188918786, 2, 499615668803) == 142811376514
|
||||
assert _discrete_log_index_calculus(47747730623, 19410045286, 43425105668, 645239603) == 590504662
|
||||
assert _discrete_log_pohlig_hellman(98376431, 11**9, 11) == 9
|
||||
assert _discrete_log_pohlig_hellman(78723213, 11**31, 11) == 31
|
||||
assert _discrete_log_pohlig_hellman(32942478, 11**98, 11) == 98
|
||||
assert _discrete_log_pohlig_hellman(14789363, 11**444, 11) == 444
|
||||
assert discrete_log(1, 0, 2) == 0
|
||||
raises(ValueError, lambda: discrete_log(-4, 1, 3))
|
||||
raises(ValueError, lambda: discrete_log(10, 3, 2))
|
||||
assert discrete_log(587, 2**9, 2) == 9
|
||||
assert discrete_log(2456747, 3**51, 3) == 51
|
||||
assert discrete_log(32942478, 11**127, 11) == 127
|
||||
assert discrete_log(432751500361, 7**324, 7) == 324
|
||||
assert discrete_log(265390227570863,184500076053622, 2) == 17835221372061
|
||||
assert discrete_log(22708823198678103974314518195029102158525052496759285596453269189798311427475159776411276642277139650833937,
|
||||
17463946429475485293747680247507700244427944625055089103624311227422110546803452417458985046168310373075327,
|
||||
123456) == 2068031853682195777930683306640554533145512201725884603914601918777510185469769997054750835368413389728895
|
||||
args = 5779, 3528, 6215
|
||||
assert discrete_log(*args) == 687
|
||||
assert discrete_log(*Tuple(*args)) == 687
|
||||
assert quadratic_congruence(400, 85, 125, 1600) == [295, 615, 935, 1255, 1575]
|
||||
assert quadratic_congruence(3, 6, 5, 25) == [3, 20]
|
||||
assert quadratic_congruence(120, 80, 175, 500) == []
|
||||
assert quadratic_congruence(15, 14, 7, 2) == [1]
|
||||
assert quadratic_congruence(8, 15, 7, 29) == [10, 28]
|
||||
assert quadratic_congruence(160, 200, 300, 461) == [144, 431]
|
||||
assert quadratic_congruence(100000, 123456, 7415263, 48112959837082048697) == [30417843635344493501, 36001135160550533083]
|
||||
assert quadratic_congruence(65, 121, 72, 277) == [249, 252]
|
||||
assert quadratic_congruence(5, 10, 14, 2) == [0]
|
||||
assert quadratic_congruence(10, 17, 19, 2) == [1]
|
||||
assert quadratic_congruence(10, 14, 20, 2) == [0, 1]
|
||||
assert quadratic_congruence(2**48-7, 2**48-1, 4, 2**48) == [8249717183797, 31960993774868]
|
||||
assert polynomial_congruence(6*x**5 + 10*x**4 + 5*x**3 + x**2 + x + 1,
|
||||
972000) == [220999, 242999, 463999, 485999, 706999, 728999, 949999, 971999]
|
||||
|
||||
assert polynomial_congruence(x**3 - 10*x**2 + 12*x - 82, 33075) == [30287]
|
||||
assert polynomial_congruence(x**2 + x + 47, 2401) == [785, 1615]
|
||||
assert polynomial_congruence(10*x**2 + 14*x + 20, 2) == [0, 1]
|
||||
assert polynomial_congruence(x**3 + 3, 16) == [5]
|
||||
assert polynomial_congruence(65*x**2 + 121*x + 72, 277) == [249, 252]
|
||||
assert polynomial_congruence(x**4 - 4, 27) == [5, 22]
|
||||
assert polynomial_congruence(35*x**3 - 6*x**2 - 567*x + 2308, 148225) == [86957,
|
||||
111157, 122531, 146731]
|
||||
assert polynomial_congruence(x**16 - 9, 36) == [3, 9, 15, 21, 27, 33]
|
||||
assert polynomial_congruence(x**6 - 2*x**5 - 35, 6125) == [3257]
|
||||
raises(ValueError, lambda: polynomial_congruence(x**x, 6125))
|
||||
raises(ValueError, lambda: polynomial_congruence(x**i, 6125))
|
||||
raises(ValueError, lambda: polynomial_congruence(0.1*x**2 + 6, 100))
|
||||
|
||||
assert binomial_mod(-1, 1, 10) == 0
|
||||
assert binomial_mod(1, -1, 10) == 0
|
||||
raises(ValueError, lambda: binomial_mod(2, 1, -1))
|
||||
assert binomial_mod(51, 10, 10) == 0
|
||||
assert binomial_mod(10**3, 500, 3**6) == 567
|
||||
assert binomial_mod(10**18 - 1, 123456789, 4) == 0
|
||||
assert binomial_mod(10**18, 10**12, (10**5 + 3)**2) == 3744312326
|
||||
|
||||
|
||||
def test_binomial_p_pow():
|
||||
n, binomials, binomial = 1000, [1], 1
|
||||
for i in range(1, n + 1):
|
||||
binomial *= n - i + 1
|
||||
binomial //= i
|
||||
binomials.append(binomial)
|
||||
|
||||
# Test powers of two, which the algorithm treats slightly differently
|
||||
trials_2 = 100
|
||||
for _ in range(trials_2):
|
||||
m, power = randint(0, n), randint(1, 20)
|
||||
assert _binomial_mod_prime_power(n, m, 2, power) == binomials[m] % 2**power
|
||||
|
||||
# Test against other prime powers
|
||||
primes = list(sieve.primerange(2*n))
|
||||
trials = 1000
|
||||
for _ in range(trials):
|
||||
m, prime, power = randint(0, n), choice(primes), randint(1, 10)
|
||||
assert _binomial_mod_prime_power(n, m, prime, power) == binomials[m] % prime**power
|
||||
|
||||
|
||||
def test_deprecated_ntheory_symbolic_functions():
|
||||
from sympy.testing.pytest import warns_deprecated_sympy
|
||||
|
||||
with warns_deprecated_sympy():
|
||||
assert mobius(3) == -1
|
||||
with warns_deprecated_sympy():
|
||||
assert legendre_symbol(2, 3) == -1
|
||||
with warns_deprecated_sympy():
|
||||
assert jacobi_symbol(2, 3) == -1
|
||||
Loading…
Add table
Add a link
Reference in a new issue