ccxt 4.2.76__py2.py3-none-any.whl → 4.4.48__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +25 -0
  44. ccxt/abstract/kucoinfutures.py +35 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3513 -1511
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3105 -881
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +239 -50
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +201 -67
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +403 -150
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2326 -1255
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1455 -288
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +206 -89
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +467 -158
  125. ccxt/async_support/deribit.py +558 -324
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -128
  129. ccxt/async_support/gate.py +1473 -464
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1634 -269
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +1050 -355
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1777 -455
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1155 -295
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1729 -482
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3513 -1511
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3105 -881
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +239 -50
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +200 -67
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +403 -150
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2326 -1255
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1455 -288
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +206 -89
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +467 -158
  233. ccxt/deribit.py +558 -324
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1473 -464
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1633 -269
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +1050 -355
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1777 -455
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +63 -15
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +138 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +204 -82
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +967 -661
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +168 -32
  309. ccxt/pro/exmo.py +253 -21
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +93 -34
  336. ccxt/pro/poloniex.py +129 -50
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +93 -86
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +486 -70
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +465 -407
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +465 -409
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1155 -295
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.76.dist-info/METADATA +0 -626
  545. ccxt-4.2.76.dist-info/RECORD +0 -534
  546. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,637 @@
1
+ # sympy.external.ntheory
2
+ #
3
+ # This module provides pure Python implementations of some number theory
4
+ # functions that are alternately used from gmpy2 if it is installed.
5
+
6
+ import sys
7
+ import math
8
+
9
+ # import mpmath.libmp as mlib
10
+
11
+
12
+ _small_trailing = [0] * 256
13
+ for j in range(1, 8):
14
+ _small_trailing[1 << j :: 1 << (j + 1)] = [j] * (1 << (7 - j))
15
+
16
+
17
+ # def bit_scan1(x, n=0):
18
+ # if not x:
19
+ # return
20
+ # x = abs(x >> n)
21
+ # low_byte = x & 0xFF
22
+ # if low_byte:
23
+ # return _small_trailing[low_byte] + n
24
+
25
+ # t = 8 + n
26
+ # x >>= 8
27
+ # # 2**m is quick for z up through 2**30
28
+ # z = x.bit_length() - 1
29
+ # if x == 1 << z:
30
+ # return z + t
31
+
32
+ # if z < 300:
33
+ # # fixed 8-byte reduction
34
+ # while not x & 0xFF:
35
+ # x >>= 8
36
+ # t += 8
37
+ # else:
38
+ # # binary reduction important when there might be a large
39
+ # # number of trailing 0s
40
+ # p = z >> 1
41
+ # while not x & 0xFF:
42
+ # while x & ((1 << p) - 1):
43
+ # p >>= 1
44
+ # x >>= p
45
+ # t += p
46
+ # return t + _small_trailing[x & 0xFF]
47
+
48
+
49
+ # def bit_scan0(x, n=0):
50
+ # return bit_scan1(x + (1 << n), n)
51
+
52
+
53
+ # def remove(x, f):
54
+ # if f < 2:
55
+ # raise ValueError("factor must be > 1")
56
+ # if x == 0:
57
+ # return 0, 0
58
+ # if f == 2:
59
+ # b = bit_scan1(x)
60
+ # return x >> b, b
61
+ # m = 0
62
+ # y, rem = divmod(x, f)
63
+ # while not rem:
64
+ # x = y
65
+ # m += 1
66
+ # if m > 5:
67
+ # pow_list = [f**2]
68
+ # while pow_list:
69
+ # _f = pow_list[-1]
70
+ # y, rem = divmod(x, _f)
71
+ # if not rem:
72
+ # m += 1 << len(pow_list)
73
+ # x = y
74
+ # pow_list.append(_f**2)
75
+ # else:
76
+ # pow_list.pop()
77
+ # y, rem = divmod(x, f)
78
+ # return x, m
79
+
80
+
81
+ # def factorial(x):
82
+ # """Return x!."""
83
+ # return int(mlib.ifac(int(x)))
84
+
85
+
86
+ # def sqrt(x):
87
+ # """Integer square root of x."""
88
+ # return int(mlib.isqrt(int(x)))
89
+
90
+
91
+ # def sqrtrem(x):
92
+ # """Integer square root of x and remainder."""
93
+ # s, r = mlib.sqrtrem(int(x))
94
+ # return (int(s), int(r))
95
+
96
+
97
+ # if sys.version_info[:2] >= (3, 9):
98
+ # # As of Python 3.9 these can take multiple arguments
99
+ # gcd = math.gcd
100
+ # lcm = math.lcm
101
+
102
+ # else:
103
+ # # Until python 3.8 is no longer supported
104
+ # from functools import reduce
105
+
106
+
107
+ # def gcd(*args):
108
+ # """gcd of multiple integers."""
109
+ # return reduce(math.gcd, args, 0)
110
+
111
+
112
+ # def lcm(*args):
113
+ # """lcm of multiple integers."""
114
+ # if 0 in args:
115
+ # return 0
116
+ # return reduce(lambda x, y: x*y//math.gcd(x, y), args, 1)
117
+
118
+
119
+ def _sign(n):
120
+ if n < 0:
121
+ return -1, -n
122
+ return 1, n
123
+
124
+
125
+ def gcdext(a, b):
126
+ if not a or not b:
127
+ g = abs(a) or abs(b)
128
+ if not g:
129
+ return (0, 0, 0)
130
+ return (g, a // g, b // g)
131
+
132
+ x_sign, a = _sign(a)
133
+ y_sign, b = _sign(b)
134
+ x, r = 1, 0
135
+ y, s = 0, 1
136
+
137
+ while b:
138
+ q, c = divmod(a, b)
139
+ a, b = b, c
140
+ x, r = r, x - q*r
141
+ y, s = s, y - q*s
142
+
143
+ return (a, x * x_sign, y * y_sign)
144
+
145
+
146
+ # def is_square(x):
147
+ # """Return True if x is a square number."""
148
+ # if x < 0:
149
+ # return False
150
+
151
+ # # Note that the possible values of y**2 % n for a given n are limited.
152
+ # # For example, when n=4, y**2 % n can only take 0 or 1.
153
+ # # In other words, if x % 4 is 2 or 3, then x is not a square number.
154
+ # # Mathematically, it determines if it belongs to the set {y**2 % n},
155
+ # # but implementationally, it can be realized as a logical conjunction
156
+ # # with an n-bit integer.
157
+ # # see https://mersenneforum.org/showpost.php?p=110896
158
+ # # def magic(n):
159
+ # # s = {y**2 % n for y in range(n)}
160
+ # # s = set(range(n)) - s
161
+ # # return sum(1 << bit for bit in s)
162
+ # # >>> print(hex(magic(128)))
163
+ # # 0xfdfdfdedfdfdfdecfdfdfdedfdfcfdec
164
+ # # >>> print(hex(magic(99)))
165
+ # # 0x5f6f9ffb6fb7ddfcb75befdec
166
+ # # >>> print(hex(magic(91)))
167
+ # # 0x6fd1bfcfed5f3679d3ebdec
168
+ # # >>> print(hex(magic(85)))
169
+ # # 0xdef9ae771ffe3b9d67dec
170
+ # if 0xfdfdfdedfdfdfdecfdfdfdedfdfcfdec & (1 << (x & 127)):
171
+ # return False # e.g. 2, 3
172
+ # m = x % 765765 # 765765 = 99 * 91 * 85
173
+ # if 0x5f6f9ffb6fb7ddfcb75befdec & (1 << (m % 99)):
174
+ # return False # e.g. 17, 68
175
+ # if 0x6fd1bfcfed5f3679d3ebdec & (1 << (m % 91)):
176
+ # return False # e.g. 97, 388
177
+ # if 0xdef9ae771ffe3b9d67dec & (1 << (m % 85)):
178
+ # return False # e.g. 793, 1408
179
+ # return mlib.sqrtrem(int(x))[1] == 0
180
+
181
+
182
+ # def invert(x, m):
183
+ # """Modular inverse of x modulo m.
184
+
185
+ # Returns y such that x*y == 1 mod m.
186
+
187
+ # Uses ``math.pow`` but reproduces the behaviour of ``gmpy2.invert``
188
+ # which raises ZeroDivisionError if no inverse exists.
189
+ # """
190
+ # try:
191
+ # return pow(x, -1, m)
192
+ # except ValueError:
193
+ # raise ZeroDivisionError("invert() no inverse exists")
194
+
195
+
196
+ # def legendre(x, y):
197
+ # """Legendre symbol (x / y).
198
+
199
+ # Following the implementation of gmpy2,
200
+ # the error is raised only when y is an even number.
201
+ # """
202
+ # if y <= 0 or not y % 2:
203
+ # raise ValueError("y should be an odd prime")
204
+ # x %= y
205
+ # if not x:
206
+ # return 0
207
+ # if pow(x, (y - 1) // 2, y) == 1:
208
+ # return 1
209
+ # return -1
210
+
211
+
212
+ # def jacobi(x, y):
213
+ # """Jacobi symbol (x / y)."""
214
+ # if y <= 0 or not y % 2:
215
+ # raise ValueError("y should be an odd positive integer")
216
+ # x %= y
217
+ # if not x:
218
+ # return int(y == 1)
219
+ # if y == 1 or x == 1:
220
+ # return 1
221
+ # if gcd(x, y) != 1:
222
+ # return 0
223
+ # j = 1
224
+ # while x != 0:
225
+ # while x % 2 == 0 and x > 0:
226
+ # x >>= 1
227
+ # if y % 8 in [3, 5]:
228
+ # j = -j
229
+ # x, y = y, x
230
+ # if x % 4 == y % 4 == 3:
231
+ # j = -j
232
+ # x %= y
233
+ # return j
234
+
235
+
236
+ # def kronecker(x, y):
237
+ # """Kronecker symbol (x / y)."""
238
+ # if gcd(x, y) != 1:
239
+ # return 0
240
+ # if y == 0:
241
+ # return 1
242
+ # sign = -1 if y < 0 and x < 0 else 1
243
+ # y = abs(y)
244
+ # s = bit_scan1(y)
245
+ # y >>= s
246
+ # if s % 2 and x % 8 in [3, 5]:
247
+ # sign = -sign
248
+ # return sign * jacobi(x, y)
249
+
250
+
251
+ # def iroot(y, n):
252
+ # if y < 0:
253
+ # raise ValueError("y must be nonnegative")
254
+ # if n < 1:
255
+ # raise ValueError("n must be positive")
256
+ # if y in (0, 1):
257
+ # return y, True
258
+ # if n == 1:
259
+ # return y, True
260
+ # if n == 2:
261
+ # x, rem = mlib.sqrtrem(y)
262
+ # return int(x), not rem
263
+ # if n >= y.bit_length():
264
+ # return 1, False
265
+ # # Get initial estimate for Newton's method. Care must be taken to
266
+ # # avoid overflow
267
+ # try:
268
+ # guess = int(y**(1./n) + 0.5)
269
+ # except OverflowError:
270
+ # exp = math.log2(y)/n
271
+ # if exp > 53:
272
+ # shift = int(exp - 53)
273
+ # guess = int(2.0**(exp - shift) + 1) << shift
274
+ # else:
275
+ # guess = int(2.0**exp)
276
+ # if guess > 2**50:
277
+ # # Newton iteration
278
+ # xprev, x = -1, guess
279
+ # while 1:
280
+ # t = x**(n - 1)
281
+ # xprev, x = x, ((n - 1)*x + y//t)//n
282
+ # if abs(x - xprev) < 2:
283
+ # break
284
+ # else:
285
+ # x = guess
286
+ # # Compensate
287
+ # t = x**n
288
+ # while t < y:
289
+ # x += 1
290
+ # t = x**n
291
+ # while t > y:
292
+ # x -= 1
293
+ # t = x**n
294
+ # return x, t == y
295
+
296
+
297
+ # def is_fermat_prp(n, a):
298
+ # if a < 2:
299
+ # raise ValueError("is_fermat_prp() requires 'a' greater than or equal to 2")
300
+ # if n < 1:
301
+ # raise ValueError("is_fermat_prp() requires 'n' be greater than 0")
302
+ # if n == 1:
303
+ # return False
304
+ # if n % 2 == 0:
305
+ # return n == 2
306
+ # a %= n
307
+ # if gcd(n, a) != 1:
308
+ # raise ValueError("is_fermat_prp() requires gcd(n,a) == 1")
309
+ # return pow(a, n - 1, n) == 1
310
+
311
+
312
+ # def is_euler_prp(n, a):
313
+ # if a < 2:
314
+ # raise ValueError("is_euler_prp() requires 'a' greater than or equal to 2")
315
+ # if n < 1:
316
+ # raise ValueError("is_euler_prp() requires 'n' be greater than 0")
317
+ # if n == 1:
318
+ # return False
319
+ # if n % 2 == 0:
320
+ # return n == 2
321
+ # a %= n
322
+ # if gcd(n, a) != 1:
323
+ # raise ValueError("is_euler_prp() requires gcd(n,a) == 1")
324
+ # return pow(a, n >> 1, n) == jacobi(a, n) % n
325
+
326
+
327
+ # def _is_strong_prp(n, a):
328
+ # s = bit_scan1(n - 1)
329
+ # a = pow(a, n >> s, n)
330
+ # if a == 1 or a == n - 1:
331
+ # return True
332
+ # for _ in range(s - 1):
333
+ # a = pow(a, 2, n)
334
+ # if a == n - 1:
335
+ # return True
336
+ # if a == 1:
337
+ # return False
338
+ # return False
339
+
340
+
341
+ # def is_strong_prp(n, a):
342
+ # if a < 2:
343
+ # raise ValueError("is_strong_prp() requires 'a' greater than or equal to 2")
344
+ # if n < 1:
345
+ # raise ValueError("is_strong_prp() requires 'n' be greater than 0")
346
+ # if n == 1:
347
+ # return False
348
+ # if n % 2 == 0:
349
+ # return n == 2
350
+ # a %= n
351
+ # if gcd(n, a) != 1:
352
+ # raise ValueError("is_strong_prp() requires gcd(n,a) == 1")
353
+ # return _is_strong_prp(n, a)
354
+
355
+
356
+ # def _lucas_sequence(n, P, Q, k):
357
+ # r"""Return the modular Lucas sequence (U_k, V_k, Q_k).
358
+
359
+ # Explanation
360
+ # ===========
361
+
362
+ # Given a Lucas sequence defined by P, Q, returns the kth values for
363
+ # U and V, along with Q^k, all modulo n. This is intended for use with
364
+ # possibly very large values of n and k, where the combinatorial functions
365
+ # would be completely unusable.
366
+
367
+ # .. math ::
368
+ # U_k = \begin{cases}
369
+ # 0 & \text{if } k = 0\\
370
+ # 1 & \text{if } k = 1\\
371
+ # PU_{k-1} - QU_{k-2} & \text{if } k > 1
372
+ # \end{cases}\\
373
+ # V_k = \begin{cases}
374
+ # 2 & \text{if } k = 0\\
375
+ # P & \text{if } k = 1\\
376
+ # PV_{k-1} - QV_{k-2} & \text{if } k > 1
377
+ # \end{cases}
378
+
379
+ # The modular Lucas sequences are used in numerous places in number theory,
380
+ # especially in the Lucas compositeness tests and the various n + 1 proofs.
381
+
382
+ # Parameters
383
+ # ==========
384
+
385
+ # n : int
386
+ # n is an odd number greater than or equal to 3
387
+ # P : int
388
+ # Q : int
389
+ # D determined by D = P**2 - 4*Q is non-zero
390
+ # k : int
391
+ # k is a nonnegative integer
392
+
393
+ # Returns
394
+ # =======
395
+
396
+ # U, V, Qk : (int, int, int)
397
+ # `(U_k \bmod{n}, V_k \bmod{n}, Q^k \bmod{n})`
398
+
399
+ # Examples
400
+ # ========
401
+
402
+ # >>> from sympy.external.ntheory import _lucas_sequence
403
+ # >>> N = 10**2000 + 4561
404
+ # >>> sol = U, V, Qk = _lucas_sequence(N, 3, 1, N//2); sol
405
+ # (0, 2, 1)
406
+
407
+ # References
408
+ # ==========
409
+
410
+ # .. [1] https://en.wikipedia.org/wiki/Lucas_sequence
411
+
412
+ # """
413
+ # if k == 0:
414
+ # return (0, 2, 1)
415
+ # D = P**2 - 4*Q
416
+ # U = 1
417
+ # V = P
418
+ # Qk = Q % n
419
+ # if Q == 1:
420
+ # # Optimization for extra strong tests.
421
+ # for b in bin(k)[3:]:
422
+ # U = (U*V) % n
423
+ # V = (V*V - 2) % n
424
+ # if b == "1":
425
+ # U, V = U*P + V, V*P + U*D
426
+ # if U & 1:
427
+ # U += n
428
+ # if V & 1:
429
+ # V += n
430
+ # U, V = U >> 1, V >> 1
431
+ # elif P == 1 and Q == -1:
432
+ # # Small optimization for 50% of Selfridge parameters.
433
+ # for b in bin(k)[3:]:
434
+ # U = (U*V) % n
435
+ # if Qk == 1:
436
+ # V = (V*V - 2) % n
437
+ # else:
438
+ # V = (V*V + 2) % n
439
+ # Qk = 1
440
+ # if b == "1":
441
+ # # new_U = (U + V) // 2
442
+ # # new_V = (5*U + V) // 2 = 2*U + new_U
443
+ # U, V = U + V, U << 1
444
+ # if U & 1:
445
+ # U += n
446
+ # U >>= 1
447
+ # V += U
448
+ # Qk = -1
449
+ # Qk %= n
450
+ # elif P == 1:
451
+ # for b in bin(k)[3:]:
452
+ # U = (U*V) % n
453
+ # V = (V*V - 2*Qk) % n
454
+ # Qk *= Qk
455
+ # if b == "1":
456
+ # # new_U = (U + V) // 2
457
+ # # new_V = new_U - 2*Q*U
458
+ # U, V = U + V, (Q*U) << 1
459
+ # if U & 1:
460
+ # U += n
461
+ # U >>= 1
462
+ # V = U - V
463
+ # Qk *= Q
464
+ # Qk %= n
465
+ # else:
466
+ # # The general case with any P and Q.
467
+ # for b in bin(k)[3:]:
468
+ # U = (U*V) % n
469
+ # V = (V*V - 2*Qk) % n
470
+ # Qk *= Qk
471
+ # if b == "1":
472
+ # U, V = U*P + V, V*P + U*D
473
+ # if U & 1:
474
+ # U += n
475
+ # if V & 1:
476
+ # V += n
477
+ # U, V = U >> 1, V >> 1
478
+ # Qk *= Q
479
+ # Qk %= n
480
+ # return (U % n, V % n, Qk)
481
+
482
+
483
+ # def is_fibonacci_prp(n, p, q):
484
+ # d = p**2 - 4*q
485
+ # if d == 0 or p <= 0 or q not in [1, -1]:
486
+ # raise ValueError("invalid values for p,q in is_fibonacci_prp()")
487
+ # if n < 1:
488
+ # raise ValueError("is_fibonacci_prp() requires 'n' be greater than 0")
489
+ # if n == 1:
490
+ # return False
491
+ # if n % 2 == 0:
492
+ # return n == 2
493
+ # return _lucas_sequence(n, p, q, n)[1] == p % n
494
+
495
+
496
+ # def is_lucas_prp(n, p, q):
497
+ # d = p**2 - 4*q
498
+ # if d == 0:
499
+ # raise ValueError("invalid values for p,q in is_lucas_prp()")
500
+ # if n < 1:
501
+ # raise ValueError("is_lucas_prp() requires 'n' be greater than 0")
502
+ # if n == 1:
503
+ # return False
504
+ # if n % 2 == 0:
505
+ # return n == 2
506
+ # if gcd(n, q*d) not in [1, n]:
507
+ # raise ValueError("is_lucas_prp() requires gcd(n,2*q*D) == 1")
508
+ # return _lucas_sequence(n, p, q, n - jacobi(d, n))[0] == 0
509
+
510
+
511
+ # def _is_selfridge_prp(n):
512
+ # """Lucas compositeness test with the Selfridge parameters for n.
513
+
514
+ # Explanation
515
+ # ===========
516
+
517
+ # The Lucas compositeness test checks whether n is a prime number.
518
+ # The test can be run with arbitrary parameters ``P`` and ``Q``, which also change the performance of the test.
519
+ # So, which parameters are most effective for running the Lucas compositeness test?
520
+ # As an algorithm for determining ``P`` and ``Q``, Selfridge proposed method A [1]_ page 1401
521
+ # (Since two methods were proposed, referred to simply as A and B in the paper,
522
+ # we will refer to one of them as "method A").
523
+
524
+ # method A fixes ``P = 1``. Then, ``D`` defined by ``D = P**2 - 4Q`` is varied from 5, -7, 9, -11, 13, and so on,
525
+ # with the first ``D`` being ``jacobi(D, n) == -1``. Once ``D`` is determined,
526
+ # ``Q`` is determined to be ``(P**2 - D)//4``.
527
+
528
+ # References
529
+ # ==========
530
+
531
+ # .. [1] Robert Baillie, Samuel S. Wagstaff, Lucas Pseudoprimes,
532
+ # Math. Comp. Vol 35, Number 152 (1980), pp. 1391-1417,
533
+ # https://doi.org/10.1090%2FS0025-5718-1980-0583518-6
534
+ # http://mpqs.free.fr/LucasPseudoprimes.pdf
535
+
536
+ # """
537
+ # for D in range(5, 1_000_000, 2):
538
+ # if D & 2: # if D % 4 == 3
539
+ # D = -D
540
+ # j = jacobi(D, n)
541
+ # if j == -1:
542
+ # return _lucas_sequence(n, 1, (1-D) // 4, n + 1)[0] == 0
543
+ # if j == 0 and D % n:
544
+ # return False
545
+ # # When j == -1 is hard to find, suspect a square number
546
+ # if D == 13 and is_square(n):
547
+ # return False
548
+ # raise ValueError("appropriate value for D cannot be found in is_selfridge_prp()")
549
+
550
+
551
+ # def is_selfridge_prp(n):
552
+ # if n < 1:
553
+ # raise ValueError("is_selfridge_prp() requires 'n' be greater than 0")
554
+ # if n == 1:
555
+ # return False
556
+ # if n % 2 == 0:
557
+ # return n == 2
558
+ # return _is_selfridge_prp(n)
559
+
560
+
561
+ # def is_strong_lucas_prp(n, p, q):
562
+ # D = p**2 - 4*q
563
+ # if D == 0:
564
+ # raise ValueError("invalid values for p,q in is_strong_lucas_prp()")
565
+ # if n < 1:
566
+ # raise ValueError("is_selfridge_prp() requires 'n' be greater than 0")
567
+ # if n == 1:
568
+ # return False
569
+ # if n % 2 == 0:
570
+ # return n == 2
571
+ # if gcd(n, q*D) not in [1, n]:
572
+ # raise ValueError("is_strong_lucas_prp() requires gcd(n,2*q*D) == 1")
573
+ # j = jacobi(D, n)
574
+ # s = bit_scan1(n - j)
575
+ # U, V, Qk = _lucas_sequence(n, p, q, (n - j) >> s)
576
+ # if U == 0 or V == 0:
577
+ # return True
578
+ # for _ in range(s - 1):
579
+ # V = (V*V - 2*Qk) % n
580
+ # if V == 0:
581
+ # return True
582
+ # Qk = pow(Qk, 2, n)
583
+ # return False
584
+
585
+
586
+ # def _is_strong_selfridge_prp(n):
587
+ # for D in range(5, 1_000_000, 2):
588
+ # if D & 2: # if D % 4 == 3
589
+ # D = -D
590
+ # j = jacobi(D, n)
591
+ # if j == -1:
592
+ # s = bit_scan1(n + 1)
593
+ # U, V, Qk = _lucas_sequence(n, 1, (1-D) // 4, (n + 1) >> s)
594
+ # if U == 0 or V == 0:
595
+ # return True
596
+ # for _ in range(s - 1):
597
+ # V = (V*V - 2*Qk) % n
598
+ # if V == 0:
599
+ # return True
600
+ # Qk = pow(Qk, 2, n)
601
+ # return False
602
+ # if j == 0 and D % n:
603
+ # return False
604
+ # # When j == -1 is hard to find, suspect a square number
605
+ # if D == 13 and is_square(n):
606
+ # return False
607
+ # raise ValueError("appropriate value for D cannot be found in is_strong_selfridge_prp()")
608
+
609
+
610
+ # def is_strong_selfridge_prp(n):
611
+ # if n < 1:
612
+ # raise ValueError("is_strong_selfridge_prp() requires 'n' be greater than 0")
613
+ # if n == 1:
614
+ # return False
615
+ # if n % 2 == 0:
616
+ # return n == 2
617
+ # return _is_strong_selfridge_prp(n)
618
+
619
+
620
+ # def is_bpsw_prp(n):
621
+ # if n < 1:
622
+ # raise ValueError("is_bpsw_prp() requires 'n' be greater than 0")
623
+ # if n == 1:
624
+ # return False
625
+ # if n % 2 == 0:
626
+ # return n == 2
627
+ # return _is_strong_prp(n, 2) and _is_selfridge_prp(n)
628
+
629
+
630
+ # def is_strong_bpsw_prp(n):
631
+ # if n < 1:
632
+ # raise ValueError("is_strong_bpsw_prp() requires 'n' be greater than 0")
633
+ # if n == 1:
634
+ # return False
635
+ # if n % 2 == 0:
636
+ # return n == 2
637
+ # return _is_strong_prp(n, 2) and _is_strong_selfridge_prp(n)