ccxt 4.2.77__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.
- ccxt/__init__.py +36 -14
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +112 -48
- ccxt/abstract/binancecoinm.py +112 -48
- ccxt/abstract/binanceus.py +147 -83
- ccxt/abstract/binanceusdm.py +112 -48
- ccxt/abstract/bingx.py +133 -78
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitfinex1.py +69 -0
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +8 -1
- ccxt/abstract/bitmart.py +13 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitpanda.py +0 -12
- ccxt/abstract/bitrue.py +3 -3
- ccxt/abstract/bitstamp.py +26 -3
- ccxt/abstract/blofin.py +24 -0
- ccxt/abstract/btcbox.py +1 -0
- ccxt/abstract/bybit.py +29 -14
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbase.py +6 -0
- ccxt/abstract/coinbaseadvanced.py +94 -0
- ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/coincatch.py +94 -0
- ccxt/abstract/coinex.py +233 -123
- ccxt/abstract/coinmetro.py +1 -0
- ccxt/abstract/cryptocom.py +14 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/gate.py +20 -0
- ccxt/abstract/gateio.py +20 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hashkey.py +67 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +4 -3
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +24 -0
- ccxt/abstract/kucoinfutures.py +34 -0
- ccxt/abstract/luno.py +2 -0
- ccxt/abstract/mexc.py +4 -0
- ccxt/abstract/myokx.py +340 -0
- ccxt/abstract/oceanex.py +5 -0
- ccxt/abstract/okx.py +30 -0
- ccxt/abstract/onetrading.py +0 -12
- ccxt/abstract/oxfun.py +34 -0
- ccxt/abstract/paradex.py +40 -0
- ccxt/abstract/phemex.py +1 -0
- ccxt/abstract/upbit.py +4 -0
- ccxt/abstract/vertex.py +19 -0
- ccxt/abstract/whitebit.py +31 -1
- ccxt/abstract/woo.py +6 -2
- ccxt/abstract/woofipro.py +119 -0
- ccxt/abstract/xt.py +153 -0
- ccxt/abstract/zonda.py +6 -0
- ccxt/ace.py +164 -60
- ccxt/alpaca.py +727 -63
- ccxt/ascendex.py +395 -249
- ccxt/async_support/__init__.py +36 -14
- ccxt/async_support/ace.py +164 -60
- ccxt/async_support/alpaca.py +727 -63
- ccxt/async_support/ascendex.py +396 -249
- ccxt/async_support/base/exchange.py +531 -155
- ccxt/async_support/base/ws/aiohttp_client.py +28 -5
- ccxt/async_support/base/ws/cache.py +3 -2
- ccxt/async_support/base/ws/client.py +26 -5
- ccxt/async_support/base/ws/fast_client.py +4 -3
- ccxt/async_support/base/ws/functions.py +1 -1
- ccxt/async_support/base/ws/future.py +40 -31
- ccxt/async_support/base/ws/order_book_side.py +3 -0
- ccxt/async_support/bequant.py +1 -1
- ccxt/async_support/bigone.py +329 -202
- ccxt/async_support/binance.py +3030 -1087
- ccxt/async_support/binancecoinm.py +2 -1
- ccxt/async_support/binanceus.py +12 -1
- ccxt/async_support/binanceusdm.py +3 -1
- ccxt/async_support/bingx.py +3104 -880
- ccxt/async_support/bit2c.py +119 -38
- ccxt/async_support/bitbank.py +215 -76
- ccxt/async_support/bitbns.py +124 -53
- ccxt/async_support/bitfinex.py +3236 -1078
- ccxt/async_support/bitfinex1.py +1711 -0
- ccxt/async_support/bitflyer.py +238 -49
- ccxt/async_support/bitget.py +1513 -563
- ccxt/async_support/bithumb.py +199 -65
- ccxt/async_support/bitmart.py +1320 -435
- ccxt/async_support/bitmex.py +308 -111
- ccxt/async_support/bitopro.py +256 -96
- ccxt/async_support/bitrue.py +365 -233
- ccxt/async_support/bitso.py +201 -89
- ccxt/async_support/bitstamp.py +438 -269
- ccxt/async_support/bitteam.py +179 -73
- ccxt/async_support/bitvavo.py +180 -70
- ccxt/async_support/bl3p.py +92 -25
- ccxt/async_support/blockchaincom.py +193 -79
- ccxt/async_support/blofin.py +392 -148
- ccxt/async_support/btcalpha.py +161 -55
- ccxt/async_support/btcbox.py +250 -34
- ccxt/async_support/btcmarkets.py +232 -85
- ccxt/async_support/btcturk.py +159 -60
- ccxt/async_support/bybit.py +2231 -1193
- ccxt/async_support/cex.py +1409 -1329
- ccxt/async_support/coinbase.py +1454 -287
- ccxt/async_support/coinbaseadvanced.py +17 -0
- ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/async_support/coinbaseinternational.py +428 -88
- ccxt/async_support/coincatch.py +5152 -0
- ccxt/async_support/coincheck.py +121 -38
- ccxt/async_support/coinex.py +4020 -3339
- ccxt/async_support/coinlist.py +273 -116
- ccxt/async_support/coinmate.py +204 -97
- ccxt/async_support/coinmetro.py +203 -110
- ccxt/async_support/coinone.py +142 -68
- ccxt/async_support/coinsph.py +206 -89
- ccxt/async_support/coinspot.py +137 -62
- ccxt/async_support/cryptocom.py +515 -185
- ccxt/async_support/currencycom.py +203 -85
- ccxt/async_support/defx.py +2066 -0
- ccxt/async_support/delta.py +404 -109
- ccxt/async_support/deribit.py +557 -323
- ccxt/async_support/digifinex.py +340 -223
- ccxt/async_support/ellipx.py +1826 -0
- ccxt/async_support/exmo.py +259 -128
- ccxt/async_support/gate.py +1472 -463
- ccxt/async_support/gemini.py +206 -84
- ccxt/async_support/hashkey.py +4164 -0
- ccxt/async_support/hitbtc.py +334 -178
- ccxt/async_support/hollaex.py +134 -83
- ccxt/async_support/htx.py +1095 -563
- ccxt/async_support/huobijp.py +105 -56
- ccxt/async_support/hyperliquid.py +1633 -268
- ccxt/async_support/idex.py +148 -95
- ccxt/async_support/independentreserve.py +236 -31
- ccxt/async_support/indodax.py +165 -62
- ccxt/async_support/kraken.py +871 -354
- ccxt/async_support/krakenfutures.py +324 -100
- ccxt/async_support/kucoin.py +917 -357
- ccxt/async_support/kucoinfutures.py +1004 -149
- ccxt/async_support/kuna.py +138 -106
- ccxt/async_support/latoken.py +135 -79
- ccxt/async_support/lbank.py +290 -113
- ccxt/async_support/luno.py +112 -62
- ccxt/async_support/lykke.py +104 -55
- ccxt/async_support/mercado.py +36 -29
- ccxt/async_support/mexc.py +995 -429
- ccxt/async_support/myokx.py +43 -0
- ccxt/async_support/ndax.py +163 -82
- ccxt/async_support/novadax.py +121 -75
- ccxt/async_support/oceanex.py +175 -59
- ccxt/async_support/okcoin.py +222 -163
- ccxt/async_support/okx.py +1776 -454
- ccxt/async_support/onetrading.py +132 -414
- ccxt/async_support/oxfun.py +2832 -0
- ccxt/async_support/p2b.py +79 -51
- ccxt/async_support/paradex.py +2017 -0
- ccxt/async_support/paymium.py +56 -32
- ccxt/async_support/phemex.py +572 -196
- ccxt/async_support/poloniex.py +218 -95
- ccxt/async_support/poloniexfutures.py +260 -92
- ccxt/async_support/probit.py +143 -110
- ccxt/async_support/timex.py +123 -70
- ccxt/async_support/tokocrypto.py +129 -93
- ccxt/async_support/tradeogre.py +39 -25
- ccxt/async_support/upbit.py +322 -113
- ccxt/async_support/vertex.py +2983 -0
- ccxt/async_support/wavesexchange.py +227 -173
- ccxt/async_support/wazirx.py +145 -65
- ccxt/async_support/whitebit.py +533 -138
- ccxt/async_support/woo.py +1137 -296
- ccxt/async_support/woofipro.py +2716 -0
- ccxt/async_support/xt.py +4628 -0
- ccxt/async_support/yobit.py +160 -92
- ccxt/async_support/zaif.py +80 -33
- ccxt/async_support/zonda.py +140 -69
- ccxt/base/errors.py +51 -20
- ccxt/base/exchange.py +1722 -480
- ccxt/base/precise.py +10 -0
- ccxt/base/types.py +223 -4
- ccxt/bequant.py +1 -1
- ccxt/bigone.py +329 -202
- ccxt/binance.py +3030 -1087
- ccxt/binancecoinm.py +2 -1
- ccxt/binanceus.py +12 -1
- ccxt/binanceusdm.py +3 -1
- ccxt/bingx.py +3104 -880
- ccxt/bit2c.py +119 -38
- ccxt/bitbank.py +215 -76
- ccxt/bitbns.py +124 -53
- ccxt/bitfinex.py +3235 -1078
- ccxt/bitfinex1.py +1710 -0
- ccxt/bitflyer.py +238 -49
- ccxt/bitget.py +1513 -563
- ccxt/bithumb.py +198 -65
- ccxt/bitmart.py +1320 -435
- ccxt/bitmex.py +308 -111
- ccxt/bitopro.py +256 -96
- ccxt/bitrue.py +365 -233
- ccxt/bitso.py +201 -89
- ccxt/bitstamp.py +438 -269
- ccxt/bitteam.py +179 -73
- ccxt/bitvavo.py +180 -70
- ccxt/bl3p.py +92 -25
- ccxt/blockchaincom.py +193 -79
- ccxt/blofin.py +392 -148
- ccxt/btcalpha.py +161 -55
- ccxt/btcbox.py +250 -34
- ccxt/btcmarkets.py +232 -85
- ccxt/btcturk.py +159 -60
- ccxt/bybit.py +2231 -1193
- ccxt/cex.py +1408 -1329
- ccxt/coinbase.py +1454 -287
- ccxt/coinbaseadvanced.py +17 -0
- ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/coinbaseinternational.py +428 -88
- ccxt/coincatch.py +5152 -0
- ccxt/coincheck.py +121 -38
- ccxt/coinex.py +4020 -3339
- ccxt/coinlist.py +273 -116
- ccxt/coinmate.py +204 -97
- ccxt/coinmetro.py +203 -110
- ccxt/coinone.py +142 -68
- ccxt/coinsph.py +206 -89
- ccxt/coinspot.py +137 -62
- ccxt/cryptocom.py +515 -185
- ccxt/currencycom.py +203 -85
- ccxt/defx.py +2065 -0
- ccxt/delta.py +404 -109
- ccxt/deribit.py +557 -323
- ccxt/digifinex.py +340 -223
- ccxt/ellipx.py +1826 -0
- ccxt/exmo.py +259 -128
- ccxt/gate.py +1472 -463
- ccxt/gemini.py +206 -84
- ccxt/hashkey.py +4164 -0
- ccxt/hitbtc.py +334 -178
- ccxt/hollaex.py +134 -83
- ccxt/htx.py +1095 -563
- ccxt/huobijp.py +105 -56
- ccxt/hyperliquid.py +1632 -268
- ccxt/idex.py +148 -95
- ccxt/independentreserve.py +235 -31
- ccxt/indodax.py +165 -62
- ccxt/kraken.py +871 -354
- ccxt/krakenfutures.py +324 -100
- ccxt/kucoin.py +917 -357
- ccxt/kucoinfutures.py +1004 -149
- ccxt/kuna.py +138 -106
- ccxt/latoken.py +135 -79
- ccxt/lbank.py +290 -113
- ccxt/luno.py +112 -62
- ccxt/lykke.py +104 -55
- ccxt/mercado.py +36 -29
- ccxt/mexc.py +994 -429
- ccxt/myokx.py +43 -0
- ccxt/ndax.py +163 -82
- ccxt/novadax.py +121 -75
- ccxt/oceanex.py +175 -59
- ccxt/okcoin.py +222 -163
- ccxt/okx.py +1776 -454
- ccxt/onetrading.py +132 -414
- ccxt/oxfun.py +2831 -0
- ccxt/p2b.py +79 -51
- ccxt/paradex.py +2017 -0
- ccxt/paymium.py +56 -32
- ccxt/phemex.py +572 -196
- ccxt/poloniex.py +218 -95
- ccxt/poloniexfutures.py +260 -92
- ccxt/pro/__init__.py +29 -5
- ccxt/pro/alpaca.py +32 -17
- ccxt/pro/ascendex.py +62 -14
- ccxt/pro/bequant.py +4 -0
- ccxt/pro/binance.py +1596 -329
- ccxt/pro/binancecoinm.py +1 -0
- ccxt/pro/binanceus.py +2 -9
- ccxt/pro/binanceusdm.py +2 -0
- ccxt/pro/bingx.py +527 -134
- ccxt/pro/bitcoincom.py +4 -1
- ccxt/pro/bitfinex.py +731 -266
- ccxt/pro/bitfinex1.py +635 -0
- ccxt/pro/bitget.py +726 -357
- ccxt/pro/bithumb.py +380 -0
- ccxt/pro/bitmart.py +138 -39
- ccxt/pro/bitmex.py +199 -40
- ccxt/pro/bitopro.py +25 -13
- ccxt/pro/bitrue.py +31 -32
- ccxt/pro/bitstamp.py +7 -6
- ccxt/pro/bitvavo.py +203 -81
- ccxt/pro/blockchaincom.py +30 -17
- ccxt/pro/blofin.py +692 -0
- ccxt/pro/bybit.py +791 -82
- ccxt/pro/cex.py +99 -51
- ccxt/pro/coinbase.py +220 -30
- ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
- ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
- ccxt/pro/coinbaseinternational.py +193 -30
- ccxt/pro/coincatch.py +1464 -0
- ccxt/pro/coincheck.py +11 -6
- ccxt/pro/coinex.py +965 -665
- ccxt/pro/coinone.py +17 -10
- ccxt/pro/cryptocom.py +446 -66
- ccxt/pro/currencycom.py +11 -10
- ccxt/pro/defx.py +832 -0
- ccxt/pro/deribit.py +167 -31
- ccxt/pro/exmo.py +252 -20
- ccxt/pro/gate.py +729 -64
- ccxt/pro/gemini.py +44 -26
- ccxt/pro/hashkey.py +802 -0
- ccxt/pro/hitbtc.py +208 -103
- ccxt/pro/hollaex.py +25 -9
- ccxt/pro/htx.py +83 -39
- ccxt/pro/huobijp.py +17 -16
- ccxt/pro/hyperliquid.py +502 -31
- ccxt/pro/idex.py +28 -13
- ccxt/pro/independentreserve.py +21 -16
- ccxt/pro/kraken.py +298 -51
- ccxt/pro/krakenfutures.py +166 -75
- ccxt/pro/kucoin.py +395 -77
- ccxt/pro/kucoinfutures.py +400 -99
- ccxt/pro/lbank.py +52 -31
- ccxt/pro/luno.py +12 -10
- ccxt/pro/mexc.py +400 -50
- ccxt/pro/myokx.py +28 -0
- ccxt/pro/ndax.py +25 -12
- ccxt/pro/okcoin.py +28 -9
- ccxt/pro/okx.py +935 -124
- ccxt/pro/onetrading.py +41 -24
- ccxt/pro/oxfun.py +1054 -0
- ccxt/pro/p2b.py +100 -24
- ccxt/pro/paradex.py +352 -0
- ccxt/pro/phemex.py +92 -33
- ccxt/pro/poloniex.py +128 -49
- ccxt/pro/poloniexfutures.py +53 -32
- ccxt/pro/probit.py +92 -85
- ccxt/pro/upbit.py +401 -8
- ccxt/pro/vertex.py +943 -0
- ccxt/pro/wazirx.py +46 -28
- ccxt/pro/whitebit.py +65 -12
- ccxt/pro/woo.py +437 -65
- ccxt/pro/woofipro.py +1271 -0
- ccxt/pro/xt.py +1067 -0
- ccxt/probit.py +143 -110
- ccxt/static_dependencies/__init__.py +1 -1
- ccxt/static_dependencies/lark/__init__.py +38 -0
- ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
- ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
- ccxt/static_dependencies/lark/ast_utils.py +59 -0
- ccxt/static_dependencies/lark/common.py +86 -0
- ccxt/static_dependencies/lark/exceptions.py +292 -0
- ccxt/static_dependencies/lark/grammar.py +130 -0
- ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
- ccxt/static_dependencies/lark/indenter.py +143 -0
- ccxt/static_dependencies/lark/lark.py +658 -0
- ccxt/static_dependencies/lark/lexer.py +678 -0
- ccxt/static_dependencies/lark/load_grammar.py +1428 -0
- ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
- ccxt/static_dependencies/lark/parser_frontends.py +257 -0
- ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
- ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
- ccxt/static_dependencies/lark/parsers/earley.py +314 -0
- ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
- ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
- ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
- ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
- ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
- ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
- ccxt/static_dependencies/lark/py.typed +0 -0
- ccxt/static_dependencies/lark/reconstruct.py +107 -0
- ccxt/static_dependencies/lark/tools/__init__.py +70 -0
- ccxt/static_dependencies/lark/tools/nearley.py +202 -0
- ccxt/static_dependencies/lark/tools/serialize.py +32 -0
- ccxt/static_dependencies/lark/tools/standalone.py +196 -0
- ccxt/static_dependencies/lark/tree.py +267 -0
- ccxt/static_dependencies/lark/tree_matcher.py +186 -0
- ccxt/static_dependencies/lark/tree_templates.py +180 -0
- ccxt/static_dependencies/lark/utils.py +343 -0
- ccxt/static_dependencies/lark/visitors.py +596 -0
- ccxt/static_dependencies/marshmallow/__init__.py +81 -0
- ccxt/static_dependencies/marshmallow/base.py +65 -0
- ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
- ccxt/static_dependencies/marshmallow/decorators.py +231 -0
- ccxt/static_dependencies/marshmallow/error_store.py +60 -0
- ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
- ccxt/static_dependencies/marshmallow/fields.py +2114 -0
- ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
- ccxt/static_dependencies/marshmallow/py.typed +0 -0
- ccxt/static_dependencies/marshmallow/schema.py +1228 -0
- ccxt/static_dependencies/marshmallow/types.py +12 -0
- ccxt/static_dependencies/marshmallow/utils.py +378 -0
- ccxt/static_dependencies/marshmallow/validate.py +678 -0
- ccxt/static_dependencies/marshmallow/warnings.py +2 -0
- ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
- ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
- ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
- ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
- ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
- ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
- ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
- ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
- ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- ccxt/static_dependencies/starknet/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
- ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
- ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
- ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
- ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
- ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
- ccxt/static_dependencies/starknet/common.py +15 -0
- ccxt/static_dependencies/starknet/constants.py +39 -0
- ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
- ccxt/static_dependencies/starknet/hash/address.py +79 -0
- ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
- ccxt/static_dependencies/starknet/hash/selector.py +16 -0
- ccxt/static_dependencies/starknet/hash/storage.py +12 -0
- ccxt/static_dependencies/starknet/hash/utils.py +78 -0
- ccxt/static_dependencies/starknet/models/__init__.py +0 -0
- ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
- ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
- ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
- ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
- ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
- ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
- ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
- ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
- ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
- ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
- ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
- ccxt/static_dependencies/starknet/utils/schema.py +13 -0
- ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
- ccxt/static_dependencies/starkware/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
- ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
- ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
- ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
- ccxt/static_dependencies/sympy/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
- ccxt/static_dependencies/sympy/external/__init__.py +0 -0
- ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
- ccxt/static_dependencies/sympy/external/importtools.py +187 -0
- ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
- ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
- ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
- ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
- ccxt/test/{test_async.py → tests_async.py} +456 -391
- ccxt/test/tests_helpers.py +285 -0
- ccxt/test/tests_init.py +39 -0
- ccxt/test/{test_sync.py → tests_sync.py} +456 -393
- ccxt/timex.py +123 -70
- ccxt/tokocrypto.py +129 -93
- ccxt/tradeogre.py +39 -25
- ccxt/upbit.py +322 -113
- ccxt/vertex.py +2983 -0
- ccxt/wavesexchange.py +227 -173
- ccxt/wazirx.py +145 -65
- ccxt/whitebit.py +533 -138
- ccxt/woo.py +1137 -296
- ccxt/woofipro.py +2716 -0
- ccxt/xt.py +4627 -0
- ccxt/yobit.py +159 -92
- ccxt/zaif.py +80 -33
- ccxt/zonda.py +140 -69
- ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
- ccxt-4.4.48.dist-info/METADATA +646 -0
- ccxt-4.4.48.dist-info/RECORD +669 -0
- {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
- ccxt/abstract/bitbay.py +0 -47
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3496
- ccxt/async_support/flowbtc.py +0 -34
- ccxt/bitbay.py +0 -17
- ccxt/bitfinex2.py +0 -3496
- ccxt/flowbtc.py +0 -34
- ccxt/hitbtc3.py +0 -16
- ccxt/pro/bitfinex2.py +0 -1081
- ccxt/test/base/__init__.py +0 -28
- ccxt/test/base/test_account.py +0 -26
- ccxt/test/base/test_balance.py +0 -56
- ccxt/test/base/test_borrow_interest.py +0 -35
- ccxt/test/base/test_borrow_rate.py +0 -32
- ccxt/test/base/test_calculate_fee.py +0 -51
- ccxt/test/base/test_crypto.py +0 -127
- ccxt/test/base/test_currency.py +0 -76
- ccxt/test/base/test_datetime.py +0 -103
- ccxt/test/base/test_decimal_to_precision.py +0 -392
- ccxt/test/base/test_deep_extend.py +0 -68
- ccxt/test/base/test_deposit_withdrawal.py +0 -50
- ccxt/test/base/test_exchange_datetime_functions.py +0 -76
- ccxt/test/base/test_funding_rate_history.py +0 -29
- ccxt/test/base/test_last_price.py +0 -32
- ccxt/test/base/test_ledger_entry.py +0 -45
- ccxt/test/base/test_ledger_item.py +0 -48
- ccxt/test/base/test_leverage_tier.py +0 -33
- ccxt/test/base/test_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -190
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -32
- ccxt/test/base/test_open_interest.py +0 -32
- ccxt/test/base/test_order.py +0 -64
- ccxt/test/base/test_order_book.py +0 -63
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -345
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -86
- ccxt/test/base/test_trade.py +0 -47
- ccxt/test/base/test_trading_fee.py +0 -26
- ccxt/test/base/test_transaction.py +0 -39
- ccxt-4.2.77.dist-info/METADATA +0 -626
- ccxt-4.2.77.dist-info/RECORD +0 -534
- {ccxt-4.2.77.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)
|