mqt-core 3.3.2__cp314-cp314t-macosx_11_0_arm64.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.
- mqt/core/__init__.py +77 -0
- mqt/core/__main__.py +55 -0
- mqt/core/_commands.py +52 -0
- mqt/core/_compat/__init__.py +11 -0
- mqt/core/_compat/typing.py +29 -0
- mqt/core/_version.py +34 -0
- mqt/core/_version.pyi +12 -0
- mqt/core/dd.cpython-314t-darwin.so +0 -0
- mqt/core/dd.pyi +1016 -0
- mqt/core/dd_evaluation.py +368 -0
- mqt/core/fomac.cpython-314t-darwin.so +0 -0
- mqt/core/fomac.pyi +125 -0
- mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
- mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
- mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
- mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
- mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
- mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
- mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
- mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
- mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
- mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
- mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
- mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
- mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
- mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
- mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
- mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
- mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
- mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
- mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
- mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
- mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
- mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
- mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
- mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
- mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
- mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
- mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
- mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
- mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
- mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
- mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
- mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
- mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
- mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
- mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
- mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
- mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
- mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
- mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
- mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
- mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
- mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
- mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
- mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
- mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
- mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
- mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
- mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
- mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
- mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
- mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
- mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
- mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
- mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
- mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
- mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
- mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
- mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
- mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
- mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
- mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
- mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
- mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
- mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
- mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
- mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
- mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
- mqt/core/include/mqt-core/boost/config.hpp +67 -0
- mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
- mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
- mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
- mqt/core/include/mqt-core/boost/limits.hpp +146 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
- mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
- mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
- mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
- mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
- mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
- mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
- mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
- mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
- mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
- mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
- mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
- mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
- mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
- mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
- mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
- mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
- mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
- mqt/core/include/mqt-core/boost/version.hpp +32 -0
- mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +119 -0
- mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
- mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
- mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
- mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
- mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
- mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
- mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
- mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
- mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
- mqt/core/include/mqt-core/dd/CachedEdge.hpp +174 -0
- mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
- mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
- mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
- mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
- mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
- mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
- mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
- mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
- mqt/core/include/mqt-core/dd/Export.hpp +438 -0
- mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
- mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
- mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
- mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
- mqt/core/include/mqt-core/dd/Node.hpp +223 -0
- mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
- mqt/core/include/mqt-core/dd/Operations.hpp +306 -0
- mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
- mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
- mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
- mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
- mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
- mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
- mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
- mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
- mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
- mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
- mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
- mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
- mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
- mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
- mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
- mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
- mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
- mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
- mqt/core/include/mqt-core/ir/QuantumComputation.hpp +596 -0
- mqt/core/include/mqt-core/ir/Register.hpp +125 -0
- mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
- mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
- mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +212 -0
- mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
- mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
- mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
- mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
- mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
- mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
- mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
- mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
- mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
- mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
- mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
- mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
- mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
- mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
- mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
- mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
- mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
- mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
- mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
- mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
- mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
- mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
- mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
- mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
- mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
- mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
- mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
- mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
- mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
- mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
- mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
- mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
- mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
- mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
- mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
- mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
- mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
- mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
- mqt/core/include/mqt-core/qasm3/StdGates.hpp +232 -0
- mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
- mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
- mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
- mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
- mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
- mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
- mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
- mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
- mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
- mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
- mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
- mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
- mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
- mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
- mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
- mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
- mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
- mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
- mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
- mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
- mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
- mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
- mqt/core/include/nlohmann/detail/hash.hpp +129 -0
- mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
- mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
- mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
- mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
- mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
- mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
- mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
- mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
- mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
- mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
- mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
- mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
- mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
- mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
- mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
- mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
- mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
- mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
- mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
- mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
- mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
- mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
- mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
- mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
- mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
- mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
- mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
- mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
- mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
- mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
- mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
- mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
- mqt/core/include/nlohmann/json.hpp +5306 -0
- mqt/core/include/nlohmann/json_fwd.hpp +75 -0
- mqt/core/include/nlohmann/ordered_map.hpp +359 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
- mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
- mqt/core/include/qdmi/qdmi/client.h +990 -0
- mqt/core/include/qdmi/qdmi/constants.h +1139 -0
- mqt/core/include/qdmi/qdmi/device.h +602 -0
- mqt/core/include/qdmi/qdmi/types.h +78 -0
- mqt/core/include/spdlog/async.h +99 -0
- mqt/core/include/spdlog/async_logger-inl.h +84 -0
- mqt/core/include/spdlog/async_logger.h +74 -0
- mqt/core/include/spdlog/cfg/argv.h +40 -0
- mqt/core/include/spdlog/cfg/env.h +36 -0
- mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
- mqt/core/include/spdlog/cfg/helpers.h +29 -0
- mqt/core/include/spdlog/common-inl.h +68 -0
- mqt/core/include/spdlog/common.h +406 -0
- mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
- mqt/core/include/spdlog/details/backtracer.h +45 -0
- mqt/core/include/spdlog/details/circular_q.h +115 -0
- mqt/core/include/spdlog/details/console_globals.h +28 -0
- mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
- mqt/core/include/spdlog/details/file_helper.h +61 -0
- mqt/core/include/spdlog/details/fmt_helper.h +141 -0
- mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
- mqt/core/include/spdlog/details/log_msg.h +40 -0
- mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
- mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
- mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
- mqt/core/include/spdlog/details/null_mutex.h +35 -0
- mqt/core/include/spdlog/details/os-inl.h +606 -0
- mqt/core/include/spdlog/details/os.h +127 -0
- mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
- mqt/core/include/spdlog/details/periodic_worker.h +58 -0
- mqt/core/include/spdlog/details/registry-inl.h +270 -0
- mqt/core/include/spdlog/details/registry.h +131 -0
- mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
- mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
- mqt/core/include/spdlog/details/tcp_client.h +127 -0
- mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
- mqt/core/include/spdlog/details/thread_pool.h +117 -0
- mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
- mqt/core/include/spdlog/details/udp_client.h +81 -0
- mqt/core/include/spdlog/details/windows_include.h +11 -0
- mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
- mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
- mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
- mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
- mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
- mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
- mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
- mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
- mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
- mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
- mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
- mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
- mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
- mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
- mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
- mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
- mqt/core/include/spdlog/fmt/chrono.h +23 -0
- mqt/core/include/spdlog/fmt/compile.h +23 -0
- mqt/core/include/spdlog/fmt/fmt.h +30 -0
- mqt/core/include/spdlog/fmt/ostr.h +23 -0
- mqt/core/include/spdlog/fmt/ranges.h +23 -0
- mqt/core/include/spdlog/fmt/std.h +24 -0
- mqt/core/include/spdlog/fmt/xchar.h +23 -0
- mqt/core/include/spdlog/formatter.h +17 -0
- mqt/core/include/spdlog/fwd.h +18 -0
- mqt/core/include/spdlog/logger-inl.h +198 -0
- mqt/core/include/spdlog/logger.h +379 -0
- mqt/core/include/spdlog/mdc.h +52 -0
- mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
- mqt/core/include/spdlog/pattern_formatter.h +118 -0
- mqt/core/include/spdlog/sinks/android_sink.h +137 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
- mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
- mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
- mqt/core/include/spdlog/sinks/base_sink.h +51 -0
- mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
- mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
- mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
- mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
- mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
- mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
- mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
- mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
- mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
- mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
- mqt/core/include/spdlog/sinks/null_sink.h +41 -0
- mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
- mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
- mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
- mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
- mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
- mqt/core/include/spdlog/sinks/sink.h +34 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
- mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
- mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
- mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
- mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
- mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
- mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
- mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
- mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
- mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
- mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
- mqt/core/include/spdlog/spdlog-inl.h +96 -0
- mqt/core/include/spdlog/spdlog.h +357 -0
- mqt/core/include/spdlog/stopwatch.h +66 -0
- mqt/core/include/spdlog/tweakme.h +148 -0
- mqt/core/include/spdlog/version.h +11 -0
- mqt/core/ir/__init__.pyi +2078 -0
- mqt/core/ir/operations.pyi +1011 -0
- mqt/core/ir/registers.pyi +91 -0
- mqt/core/ir/symbolic.pyi +177 -0
- mqt/core/ir.cpython-314t-darwin.so +0 -0
- mqt/core/lib/libmqt-core-algorithms.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-algorithms.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-algorithms.dylib +0 -0
- mqt/core/lib/libmqt-core-circuit-optimizer.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-circuit-optimizer.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-circuit-optimizer.dylib +0 -0
- mqt/core/lib/libmqt-core-dd.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-dd.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-dd.dylib +0 -0
- mqt/core/lib/libmqt-core-ds.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-ds.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-ds.dylib +0 -0
- mqt/core/lib/libmqt-core-fomac.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-fomac.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-fomac.dylib +0 -0
- mqt/core/lib/libmqt-core-ir.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-ir.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-ir.dylib +0 -0
- mqt/core/lib/libmqt-core-na-fomac.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-na-fomac.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-na-fomac.dylib +0 -0
- mqt/core/lib/libmqt-core-na.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-na.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-na.dylib +0 -0
- mqt/core/lib/libmqt-core-qasm.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-qasm.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-qasm.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-driver.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-driver.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-driver.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device-gen.a +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-qdmi-na-device.dylib +0 -0
- mqt/core/lib/libmqt-core-zx.3.3.2.dylib +0 -0
- mqt/core/lib/libmqt-core-zx.3.3.dylib +0 -0
- mqt/core/lib/libmqt-core-zx.dylib +0 -0
- mqt/core/lib/libspdlog.a +0 -0
- mqt/core/lib/pkgconfig/spdlog.pc +13 -0
- mqt/core/na/__init__.py +12 -0
- mqt/core/na/fomac.cpython-314t-darwin.so +0 -0
- mqt/core/na/fomac.pyi +117 -0
- mqt/core/plugins/__init__.py +9 -0
- mqt/core/plugins/qiskit/__init__.py +19 -0
- mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
- mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
- mqt/core/py.typed +2 -0
- mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
- mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
- mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
- mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -0
- mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
- mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
- mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +52 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
- mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +446 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
- mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +109 -0
- mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
- mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
- mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
- mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
- mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
- mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
- mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
- mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +118 -0
- mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
- mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
- mqt_core-3.3.2.dist-info/METADATA +210 -0
- mqt_core-3.3.2.dist-info/RECORD +546 -0
- mqt_core-3.3.2.dist-info/WHEEL +6 -0
- mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
- mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright 2021 Matt Borland. Distributed under the Boost
|
|
3
|
+
// Software License, Version 1.0. (See accompanying file
|
|
4
|
+
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
5
|
+
|
|
6
|
+
#ifndef BOOST_MP_DETAIL_HASH_HPP
|
|
7
|
+
#define BOOST_MP_DETAIL_HASH_HPP
|
|
8
|
+
|
|
9
|
+
#include <cstddef>
|
|
10
|
+
#include <functional>
|
|
11
|
+
#include <boost/multiprecision/detail/standalone_config.hpp>
|
|
12
|
+
|
|
13
|
+
namespace boost { namespace multiprecision { namespace detail {
|
|
14
|
+
|
|
15
|
+
template <typename T>
|
|
16
|
+
inline std::size_t hash_value(const T& v)
|
|
17
|
+
{
|
|
18
|
+
std::hash<T> hasher;
|
|
19
|
+
return hasher(v);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#if defined(BOOST_HAS_INT128)
|
|
23
|
+
|
|
24
|
+
std::size_t hash_value(const uint128_type& val);
|
|
25
|
+
|
|
26
|
+
inline std::size_t hash_value(const int128_type& val)
|
|
27
|
+
{
|
|
28
|
+
return hash_value(static_cast<uint128_type>(val));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
#endif
|
|
32
|
+
|
|
33
|
+
inline void hash_combine(std::size_t&) {}
|
|
34
|
+
|
|
35
|
+
template <typename T, typename... Args>
|
|
36
|
+
inline void hash_combine(std::size_t& seed, const T& v, Args... args)
|
|
37
|
+
{
|
|
38
|
+
constexpr std::size_t adder = 0x9e3779b9;
|
|
39
|
+
seed = seed ^ (hash_value(v) + adder + (seed<<6) + (seed>>2));
|
|
40
|
+
hash_combine(seed, args...);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
#if defined(BOOST_HAS_INT128)
|
|
44
|
+
|
|
45
|
+
inline std::size_t hash_value(const uint128_type& val)
|
|
46
|
+
{
|
|
47
|
+
std::size_t result = static_cast<std::size_t>(val);
|
|
48
|
+
hash_combine(result, static_cast<std::size_t>(val >> 64));
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
#endif
|
|
53
|
+
|
|
54
|
+
}}} // Namespaces
|
|
55
|
+
|
|
56
|
+
#endif // BOOST_MP_DETAIL_HASH_HPP
|
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright 2012 John Maddock. Distributed under the Boost
|
|
3
|
+
// Software License, Version 1.0. (See accompanying file
|
|
4
|
+
// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
|
|
5
|
+
|
|
6
|
+
#ifndef BOOST_MP_DETAIL_INTEGER_OPS_HPP
|
|
7
|
+
#define BOOST_MP_DETAIL_INTEGER_OPS_HPP
|
|
8
|
+
|
|
9
|
+
#include <boost/multiprecision/number.hpp>
|
|
10
|
+
#include <boost/multiprecision/detail/no_exceptions_support.hpp>
|
|
11
|
+
|
|
12
|
+
namespace boost { namespace multiprecision {
|
|
13
|
+
|
|
14
|
+
namespace default_ops {
|
|
15
|
+
|
|
16
|
+
template <class Backend>
|
|
17
|
+
inline BOOST_MP_CXX14_CONSTEXPR void eval_qr(const Backend& x, const Backend& y, Backend& q, Backend& r)
|
|
18
|
+
{
|
|
19
|
+
eval_divide(q, x, y);
|
|
20
|
+
eval_modulus(r, x, y);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
template <class Backend, class Integer>
|
|
24
|
+
inline BOOST_MP_CXX14_CONSTEXPR Integer eval_integer_modulus(const Backend& x, Integer val)
|
|
25
|
+
{
|
|
26
|
+
BOOST_MP_USING_ABS
|
|
27
|
+
using default_ops::eval_convert_to;
|
|
28
|
+
using default_ops::eval_modulus;
|
|
29
|
+
using int_type = typename boost::multiprecision::detail::canonical<Integer, Backend>::type;
|
|
30
|
+
Backend t;
|
|
31
|
+
eval_modulus(t, x, static_cast<int_type>(val));
|
|
32
|
+
Integer result(0);
|
|
33
|
+
eval_convert_to(&result, t);
|
|
34
|
+
return abs(result);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
template <class B>
|
|
38
|
+
inline BOOST_MP_CXX14_CONSTEXPR void eval_gcd(B& result, const B& a, const B& b)
|
|
39
|
+
{
|
|
40
|
+
using default_ops::eval_get_sign;
|
|
41
|
+
using default_ops::eval_is_zero;
|
|
42
|
+
using default_ops::eval_lsb;
|
|
43
|
+
|
|
44
|
+
std::ptrdiff_t shift(0);
|
|
45
|
+
|
|
46
|
+
B u(a), v(b);
|
|
47
|
+
|
|
48
|
+
int s = eval_get_sign(u);
|
|
49
|
+
|
|
50
|
+
/* GCD(0,x) := x */
|
|
51
|
+
if (s < 0)
|
|
52
|
+
{
|
|
53
|
+
u.negate();
|
|
54
|
+
}
|
|
55
|
+
else if (s == 0)
|
|
56
|
+
{
|
|
57
|
+
result = v;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
s = eval_get_sign(v);
|
|
61
|
+
if (s < 0)
|
|
62
|
+
{
|
|
63
|
+
v.negate();
|
|
64
|
+
}
|
|
65
|
+
else if (s == 0)
|
|
66
|
+
{
|
|
67
|
+
result = u;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Let shift := lg K, where K is the greatest power of 2
|
|
72
|
+
dividing both u and v. */
|
|
73
|
+
|
|
74
|
+
std::size_t us = eval_lsb(u);
|
|
75
|
+
std::size_t vs = eval_lsb(v);
|
|
76
|
+
shift = static_cast<std::ptrdiff_t>((std::min)(us, vs));
|
|
77
|
+
eval_right_shift(u, us);
|
|
78
|
+
eval_right_shift(v, vs);
|
|
79
|
+
|
|
80
|
+
do
|
|
81
|
+
{
|
|
82
|
+
/* Now u and v are both odd, so diff(u, v) is even.
|
|
83
|
+
Let u = min(u, v), v = diff(u, v)/2. */
|
|
84
|
+
s = u.compare(v);
|
|
85
|
+
if (s > 0)
|
|
86
|
+
u.swap(v);
|
|
87
|
+
if (s == 0)
|
|
88
|
+
break;
|
|
89
|
+
eval_subtract(v, u);
|
|
90
|
+
vs = eval_lsb(v);
|
|
91
|
+
eval_right_shift(v, vs);
|
|
92
|
+
} while (true);
|
|
93
|
+
|
|
94
|
+
result = u;
|
|
95
|
+
eval_left_shift(result, shift);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
template <class B>
|
|
99
|
+
inline BOOST_MP_CXX14_CONSTEXPR void eval_lcm(B& result, const B& a, const B& b)
|
|
100
|
+
{
|
|
101
|
+
using ui_type = typename std::tuple_element<0, typename B::unsigned_types>::type;
|
|
102
|
+
B t;
|
|
103
|
+
eval_gcd(t, a, b);
|
|
104
|
+
|
|
105
|
+
if (eval_is_zero(t))
|
|
106
|
+
{
|
|
107
|
+
result = static_cast<ui_type>(0);
|
|
108
|
+
}
|
|
109
|
+
else
|
|
110
|
+
{
|
|
111
|
+
eval_divide(result, a, t);
|
|
112
|
+
eval_multiply(result, b);
|
|
113
|
+
}
|
|
114
|
+
if (eval_get_sign(result) < 0)
|
|
115
|
+
result.negate();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
} // namespace default_ops
|
|
119
|
+
|
|
120
|
+
template <class Backend, expression_template_option ExpressionTemplates>
|
|
121
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer>::type
|
|
122
|
+
divide_qr(const number<Backend, ExpressionTemplates>& x, const number<Backend, ExpressionTemplates>& y,
|
|
123
|
+
number<Backend, ExpressionTemplates>& q, number<Backend, ExpressionTemplates>& r)
|
|
124
|
+
{
|
|
125
|
+
using default_ops::eval_qr;
|
|
126
|
+
eval_qr(x.backend(), y.backend(), q.backend(), r.backend());
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
template <class Backend, expression_template_option ExpressionTemplates, class tag, class A1, class A2, class A3, class A4>
|
|
130
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer>::type
|
|
131
|
+
divide_qr(const number<Backend, ExpressionTemplates>& x, const multiprecision::detail::expression<tag, A1, A2, A3, A4>& y,
|
|
132
|
+
number<Backend, ExpressionTemplates>& q, number<Backend, ExpressionTemplates>& r)
|
|
133
|
+
{
|
|
134
|
+
divide_qr(x, number<Backend, ExpressionTemplates>(y), q, r);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
template <class tag, class A1, class A2, class A3, class A4, class Backend, expression_template_option ExpressionTemplates>
|
|
138
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer>::type
|
|
139
|
+
divide_qr(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x, const number<Backend, ExpressionTemplates>& y,
|
|
140
|
+
number<Backend, ExpressionTemplates>& q, number<Backend, ExpressionTemplates>& r)
|
|
141
|
+
{
|
|
142
|
+
divide_qr(number<Backend, ExpressionTemplates>(x), y, q, r);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
template <class tag, class A1, class A2, class A3, class A4, class tagb, class A1b, class A2b, class A3b, class A4b, class Backend, expression_template_option ExpressionTemplates>
|
|
146
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer>::type
|
|
147
|
+
divide_qr(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x, const multiprecision::detail::expression<tagb, A1b, A2b, A3b, A4b>& y,
|
|
148
|
+
number<Backend, ExpressionTemplates>& q, number<Backend, ExpressionTemplates>& r)
|
|
149
|
+
{
|
|
150
|
+
divide_qr(number<Backend, ExpressionTemplates>(x), number<Backend, ExpressionTemplates>(y), q, r);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
template <class Backend, expression_template_option ExpressionTemplates, class Integer>
|
|
154
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value && (number_category<Backend>::value == number_kind_integer), Integer>::type
|
|
155
|
+
integer_modulus(const number<Backend, ExpressionTemplates>& x, Integer val)
|
|
156
|
+
{
|
|
157
|
+
using default_ops::eval_integer_modulus;
|
|
158
|
+
return eval_integer_modulus(x.backend(), val);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
template <class tag, class A1, class A2, class A3, class A4, class Integer>
|
|
162
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_integral<Integer>::value && (number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer), Integer>::type
|
|
163
|
+
integer_modulus(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x, Integer val)
|
|
164
|
+
{
|
|
165
|
+
using result_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;
|
|
166
|
+
return integer_modulus(result_type(x), val);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
template <class Backend, expression_template_option ExpressionTemplates>
|
|
170
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, std::size_t>::type
|
|
171
|
+
lsb(const number<Backend, ExpressionTemplates>& x)
|
|
172
|
+
{
|
|
173
|
+
using default_ops::eval_lsb;
|
|
174
|
+
return eval_lsb(x.backend());
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
template <class tag, class A1, class A2, class A3, class A4>
|
|
178
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, std::size_t>::type
|
|
179
|
+
lsb(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x)
|
|
180
|
+
{
|
|
181
|
+
using number_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;
|
|
182
|
+
number_type n(x);
|
|
183
|
+
using default_ops::eval_lsb;
|
|
184
|
+
return eval_lsb(n.backend());
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
template <class Backend, expression_template_option ExpressionTemplates>
|
|
188
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, std::size_t>::type
|
|
189
|
+
msb(const number<Backend, ExpressionTemplates>& x)
|
|
190
|
+
{
|
|
191
|
+
using default_ops::eval_msb;
|
|
192
|
+
return eval_msb(x.backend());
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
template <class tag, class A1, class A2, class A3, class A4>
|
|
196
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, std::size_t>::type
|
|
197
|
+
msb(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x)
|
|
198
|
+
{
|
|
199
|
+
using number_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;
|
|
200
|
+
number_type n(x);
|
|
201
|
+
using default_ops::eval_msb;
|
|
202
|
+
return eval_msb(n.backend());
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
template <class Backend, expression_template_option ExpressionTemplates>
|
|
206
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, bool>::type
|
|
207
|
+
bit_test(const number<Backend, ExpressionTemplates>& x, std::size_t index)
|
|
208
|
+
{
|
|
209
|
+
using default_ops::eval_bit_test;
|
|
210
|
+
return eval_bit_test(x.backend(), index);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
template <class tag, class A1, class A2, class A3, class A4>
|
|
214
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type>::value == number_kind_integer, bool>::type
|
|
215
|
+
bit_test(const multiprecision::detail::expression<tag, A1, A2, A3, A4>& x, std::size_t index)
|
|
216
|
+
{
|
|
217
|
+
using number_type = typename multiprecision::detail::expression<tag, A1, A2, A3, A4>::result_type;
|
|
218
|
+
number_type n(x);
|
|
219
|
+
using default_ops::eval_bit_test;
|
|
220
|
+
return eval_bit_test(n.backend(), index);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
template <class Backend, expression_template_option ExpressionTemplates>
|
|
224
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, number<Backend, ExpressionTemplates>&>::type
|
|
225
|
+
bit_set(number<Backend, ExpressionTemplates>& x, std::size_t index)
|
|
226
|
+
{
|
|
227
|
+
using default_ops::eval_bit_set;
|
|
228
|
+
eval_bit_set(x.backend(), index);
|
|
229
|
+
return x;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
template <class Backend, expression_template_option ExpressionTemplates>
|
|
233
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, number<Backend, ExpressionTemplates>&>::type
|
|
234
|
+
bit_unset(number<Backend, ExpressionTemplates>& x, std::size_t index)
|
|
235
|
+
{
|
|
236
|
+
using default_ops::eval_bit_unset;
|
|
237
|
+
eval_bit_unset(x.backend(), index);
|
|
238
|
+
return x;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
template <class Backend, expression_template_option ExpressionTemplates>
|
|
242
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<number_category<Backend>::value == number_kind_integer, number<Backend, ExpressionTemplates>&>::type
|
|
243
|
+
bit_flip(number<Backend, ExpressionTemplates>& x, std::size_t index)
|
|
244
|
+
{
|
|
245
|
+
using default_ops::eval_bit_flip;
|
|
246
|
+
eval_bit_flip(x.backend(), index);
|
|
247
|
+
return x;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
namespace default_ops {
|
|
251
|
+
|
|
252
|
+
//
|
|
253
|
+
// Within powm, we need a type with twice as many digits as the argument type, define
|
|
254
|
+
// a traits class to obtain that type:
|
|
255
|
+
//
|
|
256
|
+
template <class Backend>
|
|
257
|
+
struct double_precision_type
|
|
258
|
+
{
|
|
259
|
+
using type = Backend;
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
//
|
|
263
|
+
// If the exponent is a signed integer type, then we need to
|
|
264
|
+
// check the value is positive:
|
|
265
|
+
//
|
|
266
|
+
template <class Backend>
|
|
267
|
+
inline BOOST_MP_CXX14_CONSTEXPR void check_sign_of_backend(const Backend& v, const std::integral_constant<bool, true>)
|
|
268
|
+
{
|
|
269
|
+
if (eval_get_sign(v) < 0)
|
|
270
|
+
{
|
|
271
|
+
BOOST_MP_THROW_EXCEPTION(std::runtime_error("powm requires a positive exponent."));
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
template <class Backend>
|
|
275
|
+
inline BOOST_MP_CXX14_CONSTEXPR void check_sign_of_backend(const Backend&, const std::integral_constant<bool, false>) {}
|
|
276
|
+
//
|
|
277
|
+
// Calculate (a^p)%c:
|
|
278
|
+
//
|
|
279
|
+
template <class Backend>
|
|
280
|
+
BOOST_MP_CXX14_CONSTEXPR void eval_powm(Backend& result, const Backend& a, const Backend& p, const Backend& c)
|
|
281
|
+
{
|
|
282
|
+
using default_ops::eval_bit_test;
|
|
283
|
+
using default_ops::eval_get_sign;
|
|
284
|
+
using default_ops::eval_modulus;
|
|
285
|
+
using default_ops::eval_multiply;
|
|
286
|
+
using default_ops::eval_right_shift;
|
|
287
|
+
|
|
288
|
+
using double_type = typename double_precision_type<Backend>::type ;
|
|
289
|
+
using ui_type = typename boost::multiprecision::detail::canonical<unsigned char, double_type>::type;
|
|
290
|
+
|
|
291
|
+
check_sign_of_backend(p, std::integral_constant<bool, std::numeric_limits<number<Backend> >::is_signed>());
|
|
292
|
+
|
|
293
|
+
double_type x, y(a), b(p), t;
|
|
294
|
+
x = ui_type(1u);
|
|
295
|
+
|
|
296
|
+
while (eval_get_sign(b) > 0)
|
|
297
|
+
{
|
|
298
|
+
if (eval_bit_test(b, 0))
|
|
299
|
+
{
|
|
300
|
+
eval_multiply(t, x, y);
|
|
301
|
+
eval_modulus(x, t, c);
|
|
302
|
+
}
|
|
303
|
+
eval_multiply(t, y, y);
|
|
304
|
+
eval_modulus(y, t, c);
|
|
305
|
+
eval_right_shift(b, ui_type(1));
|
|
306
|
+
}
|
|
307
|
+
Backend x2(x);
|
|
308
|
+
eval_modulus(result, x2, c);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
template <class Backend, class Integer>
|
|
312
|
+
BOOST_MP_CXX14_CONSTEXPR void eval_powm(Backend& result, const Backend& a, const Backend& p, Integer c)
|
|
313
|
+
{
|
|
314
|
+
using double_type = typename double_precision_type<Backend>::type ;
|
|
315
|
+
using ui_type = typename boost::multiprecision::detail::canonical<unsigned char, double_type>::type;
|
|
316
|
+
using i1_type = typename boost::multiprecision::detail::canonical<Integer, double_type>::type ;
|
|
317
|
+
using i2_type = typename boost::multiprecision::detail::canonical<Integer, Backend>::type ;
|
|
318
|
+
|
|
319
|
+
using default_ops::eval_bit_test;
|
|
320
|
+
using default_ops::eval_get_sign;
|
|
321
|
+
using default_ops::eval_modulus;
|
|
322
|
+
using default_ops::eval_multiply;
|
|
323
|
+
using default_ops::eval_right_shift;
|
|
324
|
+
|
|
325
|
+
check_sign_of_backend(p, std::integral_constant<bool, std::numeric_limits<number<Backend> >::is_signed>());
|
|
326
|
+
|
|
327
|
+
if (eval_get_sign(p) < 0)
|
|
328
|
+
{
|
|
329
|
+
BOOST_MP_THROW_EXCEPTION(std::runtime_error("powm requires a positive exponent."));
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
double_type x, y(a), b(p), t;
|
|
333
|
+
x = ui_type(1u);
|
|
334
|
+
|
|
335
|
+
while (eval_get_sign(b) > 0)
|
|
336
|
+
{
|
|
337
|
+
if (eval_bit_test(b, 0))
|
|
338
|
+
{
|
|
339
|
+
eval_multiply(t, x, y);
|
|
340
|
+
eval_modulus(x, t, static_cast<i1_type>(c));
|
|
341
|
+
}
|
|
342
|
+
eval_multiply(t, y, y);
|
|
343
|
+
eval_modulus(y, t, static_cast<i1_type>(c));
|
|
344
|
+
eval_right_shift(b, ui_type(1));
|
|
345
|
+
}
|
|
346
|
+
Backend x2(x);
|
|
347
|
+
eval_modulus(result, x2, static_cast<i2_type>(c));
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
template <class Backend, class Integer>
|
|
351
|
+
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_unsigned<Integer>::value >::type eval_powm(Backend& result, const Backend& a, Integer b, const Backend& c)
|
|
352
|
+
{
|
|
353
|
+
using double_type = typename double_precision_type<Backend>::type ;
|
|
354
|
+
using ui_type = typename boost::multiprecision::detail::canonical<unsigned char, double_type>::type;
|
|
355
|
+
|
|
356
|
+
using default_ops::eval_bit_test;
|
|
357
|
+
using default_ops::eval_get_sign;
|
|
358
|
+
using default_ops::eval_modulus;
|
|
359
|
+
using default_ops::eval_multiply;
|
|
360
|
+
using default_ops::eval_right_shift;
|
|
361
|
+
|
|
362
|
+
double_type x, y(a), t;
|
|
363
|
+
x = ui_type(1u);
|
|
364
|
+
|
|
365
|
+
while (b > 0)
|
|
366
|
+
{
|
|
367
|
+
if (b & 1)
|
|
368
|
+
{
|
|
369
|
+
eval_multiply(t, x, y);
|
|
370
|
+
eval_modulus(x, t, c);
|
|
371
|
+
}
|
|
372
|
+
eval_multiply(t, y, y);
|
|
373
|
+
eval_modulus(y, t, c);
|
|
374
|
+
b >>= 1;
|
|
375
|
+
}
|
|
376
|
+
Backend x2(x);
|
|
377
|
+
eval_modulus(result, x2, c);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
template <class Backend, class Integer>
|
|
381
|
+
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_signed<Integer>::value && boost::multiprecision::detail::is_integral<Integer>::value>::type eval_powm(Backend& result, const Backend& a, Integer b, const Backend& c)
|
|
382
|
+
{
|
|
383
|
+
if (b < 0)
|
|
384
|
+
{
|
|
385
|
+
BOOST_MP_THROW_EXCEPTION(std::runtime_error("powm requires a positive exponent."));
|
|
386
|
+
}
|
|
387
|
+
eval_powm(result, a, static_cast<typename boost::multiprecision::detail::make_unsigned<Integer>::type>(b), c);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
template <class Backend, class Integer1, class Integer2>
|
|
391
|
+
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_unsigned<Integer1>::value >::type eval_powm(Backend& result, const Backend& a, Integer1 b, Integer2 c)
|
|
392
|
+
{
|
|
393
|
+
using double_type = typename double_precision_type<Backend>::type ;
|
|
394
|
+
using ui_type = typename boost::multiprecision::detail::canonical<unsigned char, double_type>::type;
|
|
395
|
+
using i1_type = typename boost::multiprecision::detail::canonical<Integer1, double_type>::type ;
|
|
396
|
+
using i2_type = typename boost::multiprecision::detail::canonical<Integer2, Backend>::type ;
|
|
397
|
+
|
|
398
|
+
using default_ops::eval_bit_test;
|
|
399
|
+
using default_ops::eval_get_sign;
|
|
400
|
+
using default_ops::eval_modulus;
|
|
401
|
+
using default_ops::eval_multiply;
|
|
402
|
+
using default_ops::eval_right_shift;
|
|
403
|
+
|
|
404
|
+
double_type x, y(a), t;
|
|
405
|
+
x = ui_type(1u);
|
|
406
|
+
|
|
407
|
+
while (b > 0)
|
|
408
|
+
{
|
|
409
|
+
if (b & 1)
|
|
410
|
+
{
|
|
411
|
+
eval_multiply(t, x, y);
|
|
412
|
+
eval_modulus(x, t, static_cast<i1_type>(c));
|
|
413
|
+
}
|
|
414
|
+
eval_multiply(t, y, y);
|
|
415
|
+
eval_modulus(y, t, static_cast<i1_type>(c));
|
|
416
|
+
b >>= 1;
|
|
417
|
+
}
|
|
418
|
+
Backend x2(x);
|
|
419
|
+
eval_modulus(result, x2, static_cast<i2_type>(c));
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
template <class Backend, class Integer1, class Integer2>
|
|
423
|
+
BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<boost::multiprecision::detail::is_signed<Integer1>::value && boost::multiprecision::detail::is_integral<Integer1>::value>::type eval_powm(Backend& result, const Backend& a, Integer1 b, Integer2 c)
|
|
424
|
+
{
|
|
425
|
+
if (b < 0)
|
|
426
|
+
{
|
|
427
|
+
BOOST_MP_THROW_EXCEPTION(std::runtime_error("powm requires a positive exponent."));
|
|
428
|
+
}
|
|
429
|
+
eval_powm(result, a, static_cast<typename boost::multiprecision::detail::make_unsigned<Integer1>::type>(b), c);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
struct powm_func
|
|
433
|
+
{
|
|
434
|
+
template <class T, class U, class V>
|
|
435
|
+
BOOST_MP_CXX14_CONSTEXPR void operator()(T& result, const T& b, const U& p, const V& m) const
|
|
436
|
+
{
|
|
437
|
+
eval_powm(result, b, p, m);
|
|
438
|
+
}
|
|
439
|
+
template <class R, class T, class U, class V>
|
|
440
|
+
BOOST_MP_CXX14_CONSTEXPR void operator()(R& result, const T& b, const U& p, const V& m) const
|
|
441
|
+
{
|
|
442
|
+
T temp;
|
|
443
|
+
eval_powm(temp, b, p, m);
|
|
444
|
+
result = std::move(temp);
|
|
445
|
+
}
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
} // namespace default_ops
|
|
449
|
+
|
|
450
|
+
template <class T, class U, class V>
|
|
451
|
+
inline BOOST_MP_CXX14_CONSTEXPR typename std::enable_if<
|
|
452
|
+
(number_category<T>::value == number_kind_integer) &&
|
|
453
|
+
(is_number<T>::value || is_number_expression<T>::value) &&
|
|
454
|
+
(is_number<U>::value || is_number_expression<U>::value || boost::multiprecision::detail::is_integral<U>::value) &&
|
|
455
|
+
(is_number<V>::value || is_number_expression<V>::value || boost::multiprecision::detail::is_integral<V>::value),
|
|
456
|
+
typename std::conditional<
|
|
457
|
+
is_no_et_number<T>::value,
|
|
458
|
+
T,
|
|
459
|
+
typename std::conditional<
|
|
460
|
+
is_no_et_number<U>::value,
|
|
461
|
+
U,
|
|
462
|
+
typename std::conditional<
|
|
463
|
+
is_no_et_number<V>::value,
|
|
464
|
+
V,
|
|
465
|
+
detail::expression<detail::function, default_ops::powm_func, T, U, V> >::type>::type>::type>::type
|
|
466
|
+
powm(const T& b, const U& p, const V& mod)
|
|
467
|
+
{
|
|
468
|
+
return detail::expression<detail::function, default_ops::powm_func, T, U, V>(
|
|
469
|
+
default_ops::powm_func(), b, p, mod);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
}} // namespace boost::multiprecision
|
|
473
|
+
|
|
474
|
+
#endif
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright 2019 John Maddock. Distributed under the Boost
|
|
3
|
+
// Software License, Version 1.0. (See accompanying file
|
|
4
|
+
// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
|
|
5
|
+
//
|
|
6
|
+
// We used to use lexical_cast internally for quick conversions from integers
|
|
7
|
+
// to strings, but that breaks if the global locale is something other than "C".
|
|
8
|
+
// See https://github.com/boostorg/multiprecision/issues/167.
|
|
9
|
+
//
|
|
10
|
+
#ifndef BOOST_MP_DETAIL_ITOS_HPP
|
|
11
|
+
#define BOOST_MP_DETAIL_ITOS_HPP
|
|
12
|
+
|
|
13
|
+
namespace boost { namespace multiprecision { namespace detail {
|
|
14
|
+
|
|
15
|
+
template <class Integer>
|
|
16
|
+
std::string itos(Integer val)
|
|
17
|
+
{
|
|
18
|
+
if (!val) return "0";
|
|
19
|
+
std::string result;
|
|
20
|
+
bool isneg = false;
|
|
21
|
+
if (val < 0)
|
|
22
|
+
{
|
|
23
|
+
val = -val;
|
|
24
|
+
isneg = true;
|
|
25
|
+
}
|
|
26
|
+
while (val)
|
|
27
|
+
{
|
|
28
|
+
result.insert(result.begin(), char('0' + (val % 10)));
|
|
29
|
+
val /= 10;
|
|
30
|
+
}
|
|
31
|
+
if (isneg)
|
|
32
|
+
result.insert(result.begin(), '-');
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
}}} // namespace boost::multiprecision::detail
|
|
38
|
+
|
|
39
|
+
#endif
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright 2016 John Maddock. Distributed under the Boost
|
|
3
|
+
// Software License, Version 1.0. (See accompanying file
|
|
4
|
+
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
5
|
+
|
|
6
|
+
#ifndef BOOST_MP_MIN_MAX_HPP
|
|
7
|
+
#define BOOST_MP_MIN_MAX_HPP
|
|
8
|
+
|
|
9
|
+
#include <boost/multiprecision/traits/is_backend.hpp>
|
|
10
|
+
|
|
11
|
+
namespace boost { namespace multiprecision {
|
|
12
|
+
|
|
13
|
+
//
|
|
14
|
+
// Expression template overloads for (min) and (max):
|
|
15
|
+
//
|
|
16
|
+
// Introduced in response to https://svn.boost.org/trac/boost/ticket/11149
|
|
17
|
+
// note that these can not legally be injected into namespace std, and that doing so
|
|
18
|
+
// may break future enhancements to the standard. None the less adding
|
|
19
|
+
// namespace std{ using boost::multiprecision::(min); using boost::multiprecision::(max); }
|
|
20
|
+
// to your code may get some generic code working that wouldn't work otherwise.
|
|
21
|
+
//
|
|
22
|
+
// The use of enable_if on the return type is to avoid poisoning std::min/max,
|
|
23
|
+
// otherwise attempting to make an explicit call to min<long>(a, b) when these and std
|
|
24
|
+
// versions are in scope, will cause the compiler to try to instantiate the signatures
|
|
25
|
+
// for our versions as well as the std ones, which in turn instantiates number<long>
|
|
26
|
+
// which fails to compile as "long" is not a valid backend type.
|
|
27
|
+
//
|
|
28
|
+
template <class Backend>
|
|
29
|
+
inline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on>&>::type(min)(const number<Backend, et_on>& a, const number<Backend, et_on>& b)
|
|
30
|
+
{
|
|
31
|
+
return a < b ? a : b;
|
|
32
|
+
}
|
|
33
|
+
template <class Backend, class tag, class A1, class A2, class A3, class A4>
|
|
34
|
+
inline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on> >::type(min)(const number<Backend, et_on>& a, const detail::expression<tag, A1, A2, A3, A4>& b)
|
|
35
|
+
{
|
|
36
|
+
number<Backend, et_on> t(b);
|
|
37
|
+
if (a < t)
|
|
38
|
+
return a;
|
|
39
|
+
return t;
|
|
40
|
+
}
|
|
41
|
+
template <class tag, class A1, class A2, class A3, class A4, class Backend>
|
|
42
|
+
inline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on> >::type(min)(const detail::expression<tag, A1, A2, A3, A4>& a, const number<Backend, et_on>& b)
|
|
43
|
+
{
|
|
44
|
+
number<Backend, et_on> t(a);
|
|
45
|
+
if (t < b)
|
|
46
|
+
return t;
|
|
47
|
+
return b;
|
|
48
|
+
}
|
|
49
|
+
template <class tag, class A1, class A2, class A3, class A4, class tagb, class A1b, class A2b, class A3b, class A4b>
|
|
50
|
+
inline typename detail::expression<tag, A1, A2, A3, A4>::result_type(min)(const detail::expression<tag, A1, A2, A3, A4>& a, const detail::expression<tagb, A1b, A2b, A3b, A4b>& b)
|
|
51
|
+
{
|
|
52
|
+
typename detail::expression<tag, A1, A2, A3, A4>::result_type t1(a), t2(b);
|
|
53
|
+
if (t1 < t2)
|
|
54
|
+
return t1;
|
|
55
|
+
return t2;
|
|
56
|
+
}
|
|
57
|
+
template <class tag, class A1, class A2, class A3, class A4>
|
|
58
|
+
inline typename detail::expression<tag, A1, A2, A3, A4>::result_type(min)(const detail::expression<tag, A1, A2, A3, A4>& a, const detail::expression<tag, A1, A2, A3, A4>& b)
|
|
59
|
+
{
|
|
60
|
+
typename detail::expression<tag, A1, A2, A3, A4>::result_type t1(a), t2(b);
|
|
61
|
+
if (t1 < t2)
|
|
62
|
+
return t1;
|
|
63
|
+
return t2;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
template <class Backend>
|
|
67
|
+
inline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on>&>::type(max)(const number<Backend, et_on>& a, const number<Backend, et_on>& b)
|
|
68
|
+
{
|
|
69
|
+
return a > b ? a : b;
|
|
70
|
+
}
|
|
71
|
+
template <class Backend, class tag, class A1, class A2, class A3, class A4>
|
|
72
|
+
inline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on> >::type(max)(const number<Backend, et_on>& a, const detail::expression<tag, A1, A2, A3, A4>& b)
|
|
73
|
+
{
|
|
74
|
+
number<Backend, et_on> t(b);
|
|
75
|
+
if (a > t)
|
|
76
|
+
return a;
|
|
77
|
+
return t;
|
|
78
|
+
}
|
|
79
|
+
template <class tag, class A1, class A2, class A3, class A4, class Backend>
|
|
80
|
+
inline typename std::enable_if<boost::multiprecision::detail::is_backend<Backend>::value, const number<Backend, et_on> >::type(max)(const detail::expression<tag, A1, A2, A3, A4>& a, const number<Backend, et_on>& b)
|
|
81
|
+
{
|
|
82
|
+
number<Backend, et_on> t(a);
|
|
83
|
+
if (t > b)
|
|
84
|
+
return t;
|
|
85
|
+
return b;
|
|
86
|
+
}
|
|
87
|
+
template <class tag, class A1, class A2, class A3, class A4, class tagb, class A1b, class A2b, class A3b, class A4b>
|
|
88
|
+
inline typename detail::expression<tag, A1, A2, A3, A4>::result_type(max)(const detail::expression<tag, A1, A2, A3, A4>& a, const detail::expression<tagb, A1b, A2b, A3b, A4b>& b)
|
|
89
|
+
{
|
|
90
|
+
typename detail::expression<tag, A1, A2, A3, A4>::result_type t1(a), t2(b);
|
|
91
|
+
if (t1 > t2)
|
|
92
|
+
return t1;
|
|
93
|
+
return t2;
|
|
94
|
+
}
|
|
95
|
+
template <class tag, class A1, class A2, class A3, class A4>
|
|
96
|
+
inline typename detail::expression<tag, A1, A2, A3, A4>::result_type(max)(const detail::expression<tag, A1, A2, A3, A4>& a, const detail::expression<tag, A1, A2, A3, A4>& b)
|
|
97
|
+
{
|
|
98
|
+
typename detail::expression<tag, A1, A2, A3, A4>::result_type t1(a), t2(b);
|
|
99
|
+
if (t1 > t2)
|
|
100
|
+
return t1;
|
|
101
|
+
return t2;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
}} // namespace boost::multiprecision
|
|
105
|
+
|
|
106
|
+
#endif
|