Arbitrary precision complex intervals (parent class)¶
AUTHORS:
William Stein wrote complex_field.py.
William Stein (2006-01-26): complete rewrite
Then complex_field.py
was copied to complex_interval_field.py
and
heavily modified:
Carl Witty (2007-10-24): rewrite for intervals
Niles Johnson (2010-08): Issue #3893:
random_element()
should pass on*args
and**kwds
.Travis Scrimshaw (2012-10-18): Added documentation to get full coverage.
Note
The ComplexIntervalField
differs from ComplexField
in
that ComplexIntervalField
only gives the digits with exact
precision, then a ?
signifying that the last digit can have an error of
+/-1
.
- sage.rings.complex_interval_field.ComplexIntervalField(prec=53, names=None)[source]¶
Return the complex interval field with real and imaginary parts having
prec
bits of precision.EXAMPLES:
sage: ComplexIntervalField() Complex Interval Field with 53 bits of precision sage: ComplexIntervalField(100) Complex Interval Field with 100 bits of precision sage: ComplexIntervalField(100).base_ring() Real Interval Field with 100 bits of precision sage: i = ComplexIntervalField(200).gen() sage: i^2 -1 sage: i^i 0.207879576350761908546955619834978770033877841631769608075136?
>>> from sage.all import * >>> ComplexIntervalField() Complex Interval Field with 53 bits of precision >>> ComplexIntervalField(Integer(100)) Complex Interval Field with 100 bits of precision >>> ComplexIntervalField(Integer(100)).base_ring() Real Interval Field with 100 bits of precision >>> i = ComplexIntervalField(Integer(200)).gen() >>> i**Integer(2) -1 >>> i**i 0.207879576350761908546955619834978770033877841631769608075136?
ComplexIntervalField() ComplexIntervalField(100) ComplexIntervalField(100).base_ring() i = ComplexIntervalField(200).gen() i^2 i^i
- class sage.rings.complex_interval_field.ComplexIntervalField_class(prec=53)[source]¶
Bases:
ComplexIntervalField
The field of complex (interval) numbers.
EXAMPLES:
sage: C = ComplexIntervalField(); C Complex Interval Field with 53 bits of precision sage: Q = RationalField() sage: C(1/3) 0.3333333333333334? sage: C(1/3, 2) 0.3333333333333334? + 2*I
>>> from sage.all import * >>> C = ComplexIntervalField(); C Complex Interval Field with 53 bits of precision >>> Q = RationalField() >>> C(Integer(1)/Integer(3)) 0.3333333333333334? >>> C(Integer(1)/Integer(3), Integer(2)) 0.3333333333333334? + 2*I
C = ComplexIntervalField(); C Q = RationalField() C(1/3) C(1/3, 2)
We can also coerce rational numbers and integers into
C
, but coercing a polynomial will raise an exception:sage: Q = RationalField() sage: C(1/3) 0.3333333333333334? sage: S.<x> = PolynomialRing(Q) sage: C(x) Traceback (most recent call last): ... TypeError: cannot convert nonconstant polynomial
>>> from sage.all import * >>> Q = RationalField() >>> C(Integer(1)/Integer(3)) 0.3333333333333334? >>> S = PolynomialRing(Q, names=('x',)); (x,) = S._first_ngens(1) >>> C(x) Traceback (most recent call last): ... TypeError: cannot convert nonconstant polynomial
Q = RationalField() C(1/3) S.<x> = PolynomialRing(Q) C(x)
This illustrates precision:
sage: CIF = ComplexIntervalField(10); CIF(1/3, 2/3) 0.334? + 0.667?*I sage: CIF Complex Interval Field with 10 bits of precision sage: CIF = ComplexIntervalField(100); CIF Complex Interval Field with 100 bits of precision sage: z = CIF(1/3, 2/3); z 0.333333333333333333333333333334? + 0.666666666666666666666666666667?*I
>>> from sage.all import * >>> CIF = ComplexIntervalField(Integer(10)); CIF(Integer(1)/Integer(3), Integer(2)/Integer(3)) 0.334? + 0.667?*I >>> CIF Complex Interval Field with 10 bits of precision >>> CIF = ComplexIntervalField(Integer(100)); CIF Complex Interval Field with 100 bits of precision >>> z = CIF(Integer(1)/Integer(3), Integer(2)/Integer(3)); z 0.333333333333333333333333333334? + 0.666666666666666666666666666667?*I
CIF = ComplexIntervalField(10); CIF(1/3, 2/3) CIF CIF = ComplexIntervalField(100); CIF z = CIF(1/3, 2/3); z
We can load and save complex numbers and the complex interval field:
sage: saved_z = loads(z.dumps()) sage: saved_z.endpoints() == z.endpoints() True sage: loads(CIF.dumps()) == CIF True sage: k = ComplexIntervalField(100) sage: loads(dumps(k)) == k True
>>> from sage.all import * >>> saved_z = loads(z.dumps()) >>> saved_z.endpoints() == z.endpoints() True >>> loads(CIF.dumps()) == CIF True >>> k = ComplexIntervalField(Integer(100)) >>> loads(dumps(k)) == k True
saved_z = loads(z.dumps()) saved_z.endpoints() == z.endpoints() loads(CIF.dumps()) == CIF k = ComplexIntervalField(100) loads(dumps(k)) == k
This illustrates basic properties of a complex (interval) field:
sage: CIF = ComplexIntervalField(200) sage: CIF.is_field() True sage: CIF.characteristic() 0 sage: CIF.precision() 200 sage: CIF.variable_name() 'I' sage: CIF == ComplexIntervalField(200) True sage: CIF == ComplexIntervalField(53) False sage: CIF == 1.1 False sage: CIF = ComplexIntervalField(53) sage: CIF.category() Category of infinite fields sage: TestSuite(CIF).run(skip='_test_gcd_vs_xgcd')
>>> from sage.all import * >>> CIF = ComplexIntervalField(Integer(200)) >>> CIF.is_field() True >>> CIF.characteristic() 0 >>> CIF.precision() 200 >>> CIF.variable_name() 'I' >>> CIF == ComplexIntervalField(Integer(200)) True >>> CIF == ComplexIntervalField(Integer(53)) False >>> CIF == RealNumber('1.1') False >>> CIF = ComplexIntervalField(Integer(53)) >>> CIF.category() Category of infinite fields >>> TestSuite(CIF).run(skip='_test_gcd_vs_xgcd')
CIF = ComplexIntervalField(200) CIF.is_field() CIF.characteristic() CIF.precision() CIF.variable_name() CIF == ComplexIntervalField(200) CIF == ComplexIntervalField(53) CIF == 1.1 CIF = ComplexIntervalField(53) CIF.category() TestSuite(CIF).run(skip='_test_gcd_vs_xgcd')
See also
sage.rings.complex_arb.ComplexBallField
(alternative implementation of complex intervals, with more features)
- Element[source]¶
alias of
ComplexIntervalFieldElement
- characteristic()[source]¶
Return the characteristic of the complex (interval) field, which is 0.
EXAMPLES:
sage: CIF.characteristic() 0
>>> from sage.all import * >>> CIF.characteristic() 0
CIF.characteristic()
- construction()[source]¶
Return the functorial construction of this complex interval field, namely as the algebraic closure of the real interval field with the same precision.
EXAMPLES:
sage: c, S = CIF.construction(); c, S (AlgebraicClosureFunctor, Real Interval Field with 53 bits of precision) sage: CIF == c(S) True
>>> from sage.all import * >>> c, S = CIF.construction(); c, S (AlgebraicClosureFunctor, Real Interval Field with 53 bits of precision) >>> CIF == c(S) True
c, S = CIF.construction(); c, S CIF == c(S)
- gen(n=0)[source]¶
Return the generator of the complex (interval) field.
EXAMPLES:
sage: CIF.0 1*I sage: CIF.gen(0) 1*I
>>> from sage.all import * >>> CIF.gen(0) 1*I >>> CIF.gen(Integer(0)) 1*I
CIF.0 CIF.gen(0)
- is_exact()[source]¶
The complex interval field is not exact.
EXAMPLES:
sage: CIF.is_exact() False
>>> from sage.all import * >>> CIF.is_exact() False
CIF.is_exact()
- is_field(proof=True)[source]¶
Return
True
, since the complex numbers are a field.EXAMPLES:
sage: CIF.is_field() True
>>> from sage.all import * >>> CIF.is_field() True
CIF.is_field()
- middle_field()[source]¶
Return the corresponding
ComplexField
with the same precision asself
.EXAMPLES:
sage: CIF.middle_field() Complex Field with 53 bits of precision sage: ComplexIntervalField(200).middle_field() Complex Field with 200 bits of precision
>>> from sage.all import * >>> CIF.middle_field() Complex Field with 53 bits of precision >>> ComplexIntervalField(Integer(200)).middle_field() Complex Field with 200 bits of precision
CIF.middle_field() ComplexIntervalField(200).middle_field()
- ngens()[source]¶
The number of generators of this complex (interval) field as an \(\RR\)-algebra.
There is one generator, namely
sqrt(-1)
.EXAMPLES:
sage: CIF.ngens() 1
>>> from sage.all import * >>> CIF.ngens() 1
CIF.ngens()
- pi()[source]¶
Return \(\pi\) as an element in the complex (interval) field.
EXAMPLES:
sage: ComplexIntervalField(100).pi() 3.14159265358979323846264338328?
>>> from sage.all import * >>> ComplexIntervalField(Integer(100)).pi() 3.14159265358979323846264338328?
ComplexIntervalField(100).pi()
- prec()[source]¶
Return the precision of
self
(in bits).EXAMPLES:
sage: CIF.prec() 53 sage: ComplexIntervalField(200).prec() 200
>>> from sage.all import * >>> CIF.prec() 53 >>> ComplexIntervalField(Integer(200)).prec() 200
CIF.prec() ComplexIntervalField(200).prec()
- precision()[source]¶
Return the precision of
self
(in bits).EXAMPLES:
sage: CIF.prec() 53 sage: ComplexIntervalField(200).prec() 200
>>> from sage.all import * >>> CIF.prec() 53 >>> ComplexIntervalField(Integer(200)).prec() 200
CIF.prec() ComplexIntervalField(200).prec()
- random_element(*args, **kwds)[source]¶
Create a random element of
self
.This simply chooses the real and imaginary part randomly, passing arguments and keywords to the underlying real interval field.
EXAMPLES:
sage: CIF.random_element().parent() is CIF True sage: re, im = CIF.random_element(10, 20) sage: 10 <= re <= 20 True sage: 10 <= im <= 20 True
>>> from sage.all import * >>> CIF.random_element().parent() is CIF True >>> re, im = CIF.random_element(Integer(10), Integer(20)) >>> Integer(10) <= re <= Integer(20) True >>> Integer(10) <= im <= Integer(20) True
CIF.random_element().parent() is CIF re, im = CIF.random_element(10, 20) 10 <= re <= 20 10 <= im <= 20
Passes extra positional or keyword arguments through:
sage: re, im = CIF.random_element(max=0, min=-5) sage: -5 <= re <= 0 True sage: -5 <= im <= 0 True
>>> from sage.all import * >>> re, im = CIF.random_element(max=Integer(0), min=-Integer(5)) >>> -Integer(5) <= re <= Integer(0) True >>> -Integer(5) <= im <= Integer(0) True
re, im = CIF.random_element(max=0, min=-5) -5 <= re <= 0 -5 <= im <= 0
- real_field()[source]¶
Return the underlying
RealIntervalField
.EXAMPLES:
sage: R = CIF.real_field(); R Real Interval Field with 53 bits of precision sage: ComplexIntervalField(200).real_field() Real Interval Field with 200 bits of precision sage: CIF.real_field() is R True
>>> from sage.all import * >>> R = CIF.real_field(); R Real Interval Field with 53 bits of precision >>> ComplexIntervalField(Integer(200)).real_field() Real Interval Field with 200 bits of precision >>> CIF.real_field() is R True
R = CIF.real_field(); R ComplexIntervalField(200).real_field() CIF.real_field() is R
- scientific_notation(status=None)[source]¶
Set or return the scientific notation printing flag.
If this flag is
True
then complex numbers with this space as parent print using scientific notation.EXAMPLES:
sage: CIF((0.025, 2)) 0.025000000000000002? + 2*I sage: CIF.scientific_notation(True) sage: CIF((0.025, 2)) 2.5000000000000002?e-2 + 2*I sage: CIF.scientific_notation(False) sage: CIF((0.025, 2)) 0.025000000000000002? + 2*I
>>> from sage.all import * >>> CIF((RealNumber('0.025'), Integer(2))) 0.025000000000000002? + 2*I >>> CIF.scientific_notation(True) >>> CIF((RealNumber('0.025'), Integer(2))) 2.5000000000000002?e-2 + 2*I >>> CIF.scientific_notation(False) >>> CIF((RealNumber('0.025'), Integer(2))) 0.025000000000000002? + 2*I
CIF((0.025, 2)) CIF.scientific_notation(True) CIF((0.025, 2)) CIF.scientific_notation(False) CIF((0.025, 2))
- to_prec(prec)[source]¶
Return a complex interval field with the given precision.
EXAMPLES:
sage: CIF.to_prec(150) Complex Interval Field with 150 bits of precision sage: CIF.to_prec(15) Complex Interval Field with 15 bits of precision sage: CIF.to_prec(53) is CIF True
>>> from sage.all import * >>> CIF.to_prec(Integer(150)) Complex Interval Field with 150 bits of precision >>> CIF.to_prec(Integer(15)) Complex Interval Field with 15 bits of precision >>> CIF.to_prec(Integer(53)) is CIF True
CIF.to_prec(150) CIF.to_prec(15) CIF.to_prec(53) is CIF
- zeta(n=2)[source]¶
Return a primitive \(n\)-th root of unity.
Todo
Implement
ComplexIntervalFieldElement
multiplicative order and set this output to have multiplicative ordern
.INPUT:
n
– integer (default: 2)
OUTPUT: a complex \(n\)-th root of unity
EXAMPLES:
sage: CIF.zeta(2) -1 sage: CIF.zeta(5) 0.309016994374948? + 0.9510565162951536?*I
>>> from sage.all import * >>> CIF.zeta(Integer(2)) -1 >>> CIF.zeta(Integer(5)) 0.309016994374948? + 0.9510565162951536?*I
CIF.zeta(2) CIF.zeta(5)