Пример #1
0
    def __call__(self, x, im=None):
        """
        Construct an element.

        EXAMPLES::

            sage: CIF(2) # indirect doctest
            2
            sage: CIF(CIF.0)
            1*I
            sage: CIF('1+I')
            1 + 1*I
            sage: CIF(2,3)
            2 + 3*I
            sage: CIF(pi, e)
            3.141592653589794? + 2.718281828459046?*I
            sage: ComplexIntervalField(100)(CIF(RIF(2,3)))
            3.?
        """
        if im is None:
            if isinstance(x, complex_interval.ComplexIntervalFieldElement):
                if x.parent() is self:
                    return x
                else:
                    return complex_interval.ComplexIntervalFieldElement(
                        self, x)
            elif isinstance(x, complex_double.ComplexDoubleElement):
                return complex_interval.ComplexIntervalFieldElement(
                    self, x.real(), x.imag())
            elif isinstance(x, str):
                # TODO: this is probably not the best and most
                # efficient way to do this.  -- Martin Albrecht
                return complex_interval.ComplexIntervalFieldElement(
                    self,
                    sage_eval(x.replace(' ', ''),
                              locals={
                                  "I": self.gen(),
                                  "i": self.gen()
                              }))

            late_import()
            if isinstance(x, NumberFieldElement_quadratic) and list(
                    x.parent().polynomial()) == [1, 0, 1]:
                (re, im) = list(x)
                return complex_interval.ComplexIntervalFieldElement(
                    self, re, im)

            try:
                return x._complex_mpfi_(self)
            except AttributeError:
                pass
            try:
                return x._complex_mpfr_field_(self)
            except AttributeError:
                pass
        return complex_interval.ComplexIntervalFieldElement(self, x, im)
Пример #2
0
    def zeta(self, n=2):
        """
        Return a primitive $n$-th root of unity.

        INPUT:
            n -- an integer (default: 2)
            
        OUTPUT:
            a complex n-th root of unity.
        """
        from integer import Integer
        n = Integer(n)
        if n == 1:
            x = self(1)
        elif n == 2:
            x = self(-1)
        elif n >= 3:
            # Use De Moivre
            # e^(2*pi*i/n) = cos(2pi/n) + i *sin(2pi/n)
            RR = self._real_field()
            pi = RR.pi()
            z = 2 * pi / n
            x = complex_interval.ComplexIntervalFieldElement(
                self, z.cos(), z.sin())
        x._set_multiplicative_order(n)
        return x
Пример #3
0
    def gen(self, n=0):
        """
        Return the generator of the complex (interval) field.

        EXAMPLES::

            sage: CIF.0
            1*I
            sage: CIF.gen(0)
            1*I
        """
        if n != 0:
            raise IndexError("n must be 0")
        return complex_interval.ComplexIntervalFieldElement(self, 0, 1)
Пример #4
0
    def zeta(self, n=2):
        r"""
        Return a primitive `n`-th root of unity.

        .. TODO::

            Implement :class:`ComplexIntervalFieldElement` multiplicative order
            and set this output to have multiplicative order ``n``.

        INPUT:

        - ``n`` -- an 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 integer import Integer
        n = Integer(n)
        if n == 1:
            x = self(1)
        elif n == 2:
            x = self(-1)
        elif n >= 3:
            # Use De Moivre
            # e^(2*pi*i/n) = cos(2pi/n) + i *sin(2pi/n)
            RR = self._real_field()
            pi = RR.pi()
            z = 2 * pi / n
            x = complex_interval.ComplexIntervalFieldElement(
                self, z.cos(), z.sin())
        # Uncomment after implemented
        #x._set_multiplicative_order( n )
        return x
Пример #5
0
 def gen(self, n=0):
     if n != 0:
         raise IndexError, "n must be 0"
     return complex_interval.ComplexIntervalFieldElement(self, 0, 1)