123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- from sympy.assumptions import Predicate
- from sympy.multipledispatch import Dispatcher
- class IntegerPredicate(Predicate):
- """
- Integer predicate.
- Explanation
- ===========
- ``Q.integer(x)`` is true iff ``x`` belongs to the set of integer
- numbers.
- Examples
- ========
- >>> from sympy import Q, ask, S
- >>> ask(Q.integer(5))
- True
- >>> ask(Q.integer(S(1)/2))
- False
- References
- ==========
- .. [1] https://en.wikipedia.org/wiki/Integer
- """
- name = 'integer'
- handler = Dispatcher(
- "IntegerHandler",
- doc=("Handler for Q.integer.\n\n"
- "Test that an expression belongs to the field of integer numbers.")
- )
- class RationalPredicate(Predicate):
- """
- Rational number predicate.
- Explanation
- ===========
- ``Q.rational(x)`` is true iff ``x`` belongs to the set of
- rational numbers.
- Examples
- ========
- >>> from sympy import ask, Q, pi, S
- >>> ask(Q.rational(0))
- True
- >>> ask(Q.rational(S(1)/2))
- True
- >>> ask(Q.rational(pi))
- False
- References
- ==========
- .. [1] https://en.wikipedia.org/wiki/Rational_number
- """
- name = 'rational'
- handler = Dispatcher(
- "RationalHandler",
- doc=("Handler for Q.rational.\n\n"
- "Test that an expression belongs to the field of rational numbers.")
- )
- class IrrationalPredicate(Predicate):
- """
- Irrational number predicate.
- Explanation
- ===========
- ``Q.irrational(x)`` is true iff ``x`` is any real number that
- cannot be expressed as a ratio of integers.
- Examples
- ========
- >>> from sympy import ask, Q, pi, S, I
- >>> ask(Q.irrational(0))
- False
- >>> ask(Q.irrational(S(1)/2))
- False
- >>> ask(Q.irrational(pi))
- True
- >>> ask(Q.irrational(I))
- False
- References
- ==========
- .. [1] https://en.wikipedia.org/wiki/Irrational_number
- """
- name = 'irrational'
- handler = Dispatcher(
- "IrrationalHandler",
- doc=("Handler for Q.irrational.\n\n"
- "Test that an expression is irrational numbers.")
- )
- class RealPredicate(Predicate):
- r"""
- Real number predicate.
- Explanation
- ===========
- ``Q.real(x)`` is true iff ``x`` is a real number, i.e., it is in the
- interval `(-\infty, \infty)`. Note that, in particular the
- infinities are not real. Use ``Q.extended_real`` if you want to
- consider those as well.
- A few important facts about reals:
- - Every real number is positive, negative, or zero. Furthermore,
- because these sets are pairwise disjoint, each real number is
- exactly one of those three.
- - Every real number is also complex.
- - Every real number is finite.
- - Every real number is either rational or irrational.
- - Every real number is either algebraic or transcendental.
- - The facts ``Q.negative``, ``Q.zero``, ``Q.positive``,
- ``Q.nonnegative``, ``Q.nonpositive``, ``Q.nonzero``,
- ``Q.integer``, ``Q.rational``, and ``Q.irrational`` all imply
- ``Q.real``, as do all facts that imply those facts.
- - The facts ``Q.algebraic``, and ``Q.transcendental`` do not imply
- ``Q.real``; they imply ``Q.complex``. An algebraic or
- transcendental number may or may not be real.
- - The "non" facts (i.e., ``Q.nonnegative``, ``Q.nonzero``,
- ``Q.nonpositive`` and ``Q.noninteger``) are not equivalent to
- not the fact, but rather, not the fact *and* ``Q.real``.
- For example, ``Q.nonnegative`` means ``~Q.negative & Q.real``.
- So for example, ``I`` is not nonnegative, nonzero, or
- nonpositive.
- Examples
- ========
- >>> from sympy import Q, ask, symbols
- >>> x = symbols('x')
- >>> ask(Q.real(x), Q.positive(x))
- True
- >>> ask(Q.real(0))
- True
- References
- ==========
- .. [1] https://en.wikipedia.org/wiki/Real_number
- """
- name = 'real'
- handler = Dispatcher(
- "RealHandler",
- doc=("Handler for Q.real.\n\n"
- "Test that an expression belongs to the field of real numbers.")
- )
- class ExtendedRealPredicate(Predicate):
- r"""
- Extended real predicate.
- Explanation
- ===========
- ``Q.extended_real(x)`` is true iff ``x`` is a real number or
- `\{-\infty, \infty\}`.
- See documentation of ``Q.real`` for more information about related
- facts.
- Examples
- ========
- >>> from sympy import ask, Q, oo, I
- >>> ask(Q.extended_real(1))
- True
- >>> ask(Q.extended_real(I))
- False
- >>> ask(Q.extended_real(oo))
- True
- """
- name = 'extended_real'
- handler = Dispatcher(
- "ExtendedRealHandler",
- doc=("Handler for Q.extended_real.\n\n"
- "Test that an expression belongs to the field of extended real\n"
- "numbers, that is real numbers union {Infinity, -Infinity}.")
- )
- class HermitianPredicate(Predicate):
- """
- Hermitian predicate.
- Explanation
- ===========
- ``ask(Q.hermitian(x))`` is true iff ``x`` belongs to the set of
- Hermitian operators.
- References
- ==========
- .. [1] http://mathworld.wolfram.com/HermitianOperator.html
- """
- # TODO: Add examples
- name = 'hermitian'
- handler = Dispatcher(
- "HermitianHandler",
- doc=("Handler for Q.hermitian.\n\n"
- "Test that an expression belongs to the field of Hermitian operators.")
- )
- class ComplexPredicate(Predicate):
- """
- Complex number predicate.
- Explanation
- ===========
- ``Q.complex(x)`` is true iff ``x`` belongs to the set of complex
- numbers. Note that every complex number is finite.
- Examples
- ========
- >>> from sympy import Q, Symbol, ask, I, oo
- >>> x = Symbol('x')
- >>> ask(Q.complex(0))
- True
- >>> ask(Q.complex(2 + 3*I))
- True
- >>> ask(Q.complex(oo))
- False
- References
- ==========
- .. [1] https://en.wikipedia.org/wiki/Complex_number
- """
- name = 'complex'
- handler = Dispatcher(
- "ComplexHandler",
- doc=("Handler for Q.complex.\n\n"
- "Test that an expression belongs to the field of complex numbers.")
- )
- class ImaginaryPredicate(Predicate):
- """
- Imaginary number predicate.
- Explanation
- ===========
- ``Q.imaginary(x)`` is true iff ``x`` can be written as a real
- number multiplied by the imaginary unit ``I``. Please note that ``0``
- is not considered to be an imaginary number.
- Examples
- ========
- >>> from sympy import Q, ask, I
- >>> ask(Q.imaginary(3*I))
- True
- >>> ask(Q.imaginary(2 + 3*I))
- False
- >>> ask(Q.imaginary(0))
- False
- References
- ==========
- .. [1] https://en.wikipedia.org/wiki/Imaginary_number
- """
- name = 'imaginary'
- handler = Dispatcher(
- "ImaginaryHandler",
- doc=("Handler for Q.imaginary.\n\n"
- "Test that an expression belongs to the field of imaginary numbers,\n"
- "that is, numbers in the form x*I, where x is real.")
- )
- class AntihermitianPredicate(Predicate):
- """
- Antihermitian predicate.
- Explanation
- ===========
- ``Q.antihermitian(x)`` is true iff ``x`` belongs to the field of
- antihermitian operators, i.e., operators in the form ``x*I``, where
- ``x`` is Hermitian.
- References
- ==========
- .. [1] http://mathworld.wolfram.com/HermitianOperator.html
- """
- # TODO: Add examples
- name = 'antihermitian'
- handler = Dispatcher(
- "AntiHermitianHandler",
- doc=("Handler for Q.antihermitian.\n\n"
- "Test that an expression belongs to the field of anti-Hermitian\n"
- "operators, that is, operators in the form x*I, where x is Hermitian.")
- )
- class AlgebraicPredicate(Predicate):
- r"""
- Algebraic number predicate.
- Explanation
- ===========
- ``Q.algebraic(x)`` is true iff ``x`` belongs to the set of
- algebraic numbers. ``x`` is algebraic if there is some polynomial
- in ``p(x)\in \mathbb\{Q\}[x]`` such that ``p(x) = 0``.
- Examples
- ========
- >>> from sympy import ask, Q, sqrt, I, pi
- >>> ask(Q.algebraic(sqrt(2)))
- True
- >>> ask(Q.algebraic(I))
- True
- >>> ask(Q.algebraic(pi))
- False
- References
- ==========
- .. [1] https://en.wikipedia.org/wiki/Algebraic_number
- """
- name = 'algebraic'
- AlgebraicHandler = Dispatcher(
- "AlgebraicHandler",
- doc="""Handler for Q.algebraic key."""
- )
- class TranscendentalPredicate(Predicate):
- """
- Transcedental number predicate.
- Explanation
- ===========
- ``Q.transcendental(x)`` is true iff ``x`` belongs to the set of
- transcendental numbers. A transcendental number is a real
- or complex number that is not algebraic.
- """
- # TODO: Add examples
- name = 'transcendental'
- handler = Dispatcher(
- "Transcendental",
- doc="""Handler for Q.transcendental key."""
- )
|