
    gg                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddZddZd dZed!d            Zed!d            Zed!d            Zed!d            Zd"dZdS )#a  A module for special angle formulas for trigonometric functions

TODO
====

This module should be developed in the future to contain direct square root
representation of

.. math
    F(\frac{n}{m} \pi)

for every

- $m \in \{ 3, 5, 17, 257, 65537 \}$
- $n \in \mathbb{N}$, $0 \le n < m$
- $F \in \{\sin, \cos, \tan, \csc, \sec, \cot\}$

Without multi-step rewrites
(e.g. $\tan \to \cos/\sin \to \cos/\sqrt \to \ sqrt$)
or using chebyshev identities
(e.g. $\cos \to \cos + \cos^2 + \cdots \to \sqrt{} + \sqrt{}^2 + \cdots $),
which are trivial to implement in sympy,
and had used to give overly complicated expressions.

The reference can be found below, if anyone may need help implementing them.

References
==========

.. [*] Gottlieb, Christian. (1999). The Simple and straightforward construction
   of the regular 257-gon. The Mathematical Intelligencer. 21. 31-37.
   10.1007/BF03024829.
.. [*] https://resources.wolframcloud.com/FunctionRepository/resources/Cos2PiOverFermatPrime
    )annotations)Callable)reduce)Expr)S)igcdex)Integersqrt)cacheitxintreturntuple[tuple[int, ...], int]c                 <   | sdS t          |           dk    r
d| d         fS t          |           dk    r&t          | d         | d                   \  }}|f|fS t          | dd          \  }}t          | d         |          \  }}|gfd|D             R |fS )aN  Compute extended gcd for multiple integers.

    Explanation
    ===========

    Given the integers $x_1, \cdots, x_n$ and
    an extended gcd for multiple arguments are defined as a solution
    $(y_1, \cdots, y_n), g$ for the diophantine equation
    $x_1 y_1 + \cdots + x_n y_n = g$ such that
    $g = \gcd(x_1, \cdots, x_n)$.

    Examples
    ========

    >>> from sympy.functions.elementary._trigonometric_special import migcdex
    >>> migcdex()
    ((), 0)
    >>> migcdex(4)
    ((1,), 4)
    >>> migcdex(4, 6)
    ((-1, 1), 2)
    >>> migcdex(6, 10, 15)
    ((1, 1, -1), 1)
    ) r      )r   r      Nc              3  "   K   | ]	}|z  V  
d S Nr   ).0ivs     m/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/functions/elementary/_trigonometric_special.py	<genexpr>zmigcdex.<locals>.<genexpr>S   s'      ""1Q""""""    )lenr   migcdex)r   uhygr   s        @r   r   r   .   s    2  u
1vv{{QqTz
1vv{{1qt$$1a1vqyAabbE?DAqQqT1ooGAq!#"""""""##Q&&r   denomstuple[int, ...]c                 l    | sdS dd}t          ||           fd| D             }t          | \  }}|S )	a  Compute the partial fraction decomposition.

    Explanation
    ===========

    Given a rational number $\frac{1}{q_1 \cdots q_n}$ where all
    $q_1, \cdots, q_n$ are pairwise coprime,

    A partial fraction decomposition is defined as

    .. math::
        \frac{1}{q_1 \cdots q_n} = \frac{p_1}{q_1} + \cdots + \frac{p_n}{q_n}

    And it can be derived from solving the following diophantine equation for
    the $p_1, \cdots, p_n$

    .. math::
        1 = p_1 \prod_{i \ne 1}q_i + \cdots + p_n \prod_{i \ne n}q_i

    Where $q_1, \cdots, q_n$ being pairwise coprime implies
    $\gcd(\prod_{i \ne 1}q_i, \cdots, \prod_{i \ne n}q_i) = 1$,
    which guarantees the existence of the solution.

    It is sufficient to compute partial fraction decomposition only
    for numerator $1$ because partial fraction decomposition for any
    $\frac{n}{q_1 \cdots q_n}$ can be easily computed by multiplying
    the result by $n$ afterwards.

    Parameters
    ==========

    denoms : int
        The pairwise coprime integer denominators $q_i$ which defines the
        rational number $\frac{1}{q_1 \cdots q_n}$

    Returns
    =======

    tuple[int, ...]
        The list of numerators which semantically corresponds to $p_i$ of the
        partial fraction decomposition
        $\frac{1}{q_1 \cdots q_n} = \frac{p_1}{q_1} + \cdots + \frac{p_n}{q_n}$

    Examples
    ========

    >>> from sympy import Rational, Mul
    >>> from sympy.functions.elementary._trigonometric_special import ipartfrac

    >>> denoms = 2, 3, 5
    >>> numers = ipartfrac(2, 3, 5)
    >>> numers
    (1, 7, -14)

    >>> Rational(1, Mul(*denoms))
    1/30
    >>> out = 0
    >>> for n, d in zip(numers, denoms):
    ...    out += Rational(n, d)
    >>> out
    1/30
    r   r   r   r!   r   c                    | |z  S r   r   )r   r!   s     r   mulzipartfrac.<locals>.mul   s    1ur   c                    g | ]}|z  S r   r   )r   r   denoms     r   
<listcomp>zipartfrac.<locals>.<listcomp>   s    $$$!$$$r   )r   r   r!   r   r   r   )r   r   )r#   r'   ar    _r)   s        @r   	ipartfracr-   V   sc    ~  r    3E$$$$V$$$AA;DAqHr   nlist[int] | Nonec                    g }dD ]<}t          | |          \  }}|dk    r!|} |                    |           | dk    r|c S =dS )z}If n can be factored in terms of Fermat primes with
    multiplicity of each being 1, return those primes, else
    None
    )           i  r   r   N)divmodappend)r.   primespquotient	remainders        r   fermat_coordsr;      sb    
 F#  $Qll)>>AMM!Avv4r   r   c                     t           j        S )z-Computes $\cos \frac{\pi}{3}$ in square roots)r   Halfr   r   r   cos_3r>      s     6Mr   c                 ,    t          d          dz   dz  S )z-Computes $\cos \frac{\pi}{5}$ in square rootsr2   r      r
   r   r   r   cos_5rA      s     GGaK1r   c                    t          dt          d          z   dz  t          d          t          dt          d          z
            t          t          d          dt          dt          d          z             z  dt          d          z
  t          dt          d          z
            z  z
  z  dt          d          z  z   dz             z   z  dz  z             S )	z.Computes $\cos \frac{\pi}{17}$ in square roots   r3       r   ir      "   r
   r   r   r   cos_17rG      s     	d2hh"tAww$rDHH}*=*=T!WWT"tBxx-000ARL
rDHH}

4  !"T"XX.023 	4 	4+4  579 : 	:; ; ;r   c                    dd} dd} | t           j        t          d                    \  }} | |t          d	                    \  }} | |t          d	                    \  }} | |d
d|z   d|z  z   z            \  }}	 | |d
d|z   d|z  z   z            \  }
} | |d
d|z   d|z  z   z            \  }} | |d
d|z   d|z  z   z            \  }} | |d||z   |z   d|
z  z   z            \  }} | |d||z   |z   d|z  z   z            \  }} | |d||z   |	z   d|z  z   z            \  }} | |d||z   |
z   d|z  z   z            \  }} | |	d||	z   |z   d|z  z   z            \  }} | |
d||
z   |z   d|z  z   z            \  }} | |d||z   |z   d|z  z   z            \  }} | |d||z   |z   d|	z  z   z            \  }} ||d||z   |z   |z   z            }  ||d||z   |z   |z   z            }! ||d||z   |z   |z   z            }" ||d||z   |z   |z   z            }# ||d||z   |z   |z   z            }$ ||d||z   |z   |z   z            }% ||  d|!|"z   z             }& ||# d|$|%z   z             }'d ||& d|'z            z  }(t          t          d          t          |(d
z             z  dz  t           j        z             S )a  Computes $\cos \frac{\pi}{257}$ in square roots

    References
    ==========

    .. [*] https://math.stackexchange.com/questions/516142/how-does-cos2-pi-257-look-like-in-real-radicals
    .. [*] https://r-knott.surrey.ac.uk/Fibonacci/simpleTrig.html
    r+   r   br   tuple[Expr, Expr]c                n    | t          | dz  |z             z   dz  | t          | dz  |z             z
  dz  fS Nr   r
   r+   rI   s     r   f1zcos_257.<locals>.f1   s=    DANN"a'!d1a4!8nn*<)AAAr   c                8    | t          | dz  |z             z
  dz  S rL   r
   rM   s     r   f2zcos_257.<locals>.f2   s     DANN"A%%r      @   r@   r2   r      )r+   r   rI   r   r   rJ   )r+   r   rI   r   r   r   )r   NegativeOner	   r   r=   ))rN   rP   t1t2z1z3z2z4y1y5y6y2y3y7y8y4x1x9x2x10x3x11x4x12x5x13x6x14x15x7x8x16v1v2v3v4v5v6u1u2w1s)                                            r   cos_257r~      s   B B B B& & & & Rws||,,FBRGBKK  FBRGBKK  FBRAq2v"}%&&FBRAq2v"}%&&FBRAq2v"}%&&FBRAq2v"}%&&FBRBR"qt+,--FBbRb2",-..GBbRb2",-..GBbRb2",-..GBbRb2",-..GBbRb2",-..GBbRb2",-..GCbRb2",-..GB	BBGbL2%&	'	'B	BBGbL2%&	'	'B	BBGcMC'(	)	)B	BBHsNS()	*	*B	CS3Y_s*+	,	,B	CS2X]R'(	)	)B
"bS"b2g,

	B
"bS"b2g,

	B	BBsBrENN	BQR!V$Q&/000r   dict[int, Callable[[], Expr]]c                 8    t           t          t          t          dS )ag  Lazily evaluated table for $\cos \frac{\pi}{n}$ in square roots for
    $n \in \{3, 5, 17, 257, 65537\}$.

    Notes
    =====

    65537 is the only other known Fermat prime and it is nearly impossible to
    build in the current SymPy due to performance issues.

    References
    ==========

    https://r-knott.surrey.ac.uk/Fibonacci/simpleTrig.html
    )r1   r2   r3   r4   )r>   rA   rG   r~   r   r   r   	cos_tabler      s      	  r   N)r   r   r   r   )r#   r   r   r$   )r.   r   r   r/   )r   r   )r   r   )__doc__
__future__r   typingr   	functoolsr   sympy.core.exprr   sympy.core.singletonr   sympy.core.intfuncr   sympy.core.numbersr	   (sympy.functions.elementary.miscellaneousr   sympy.core.cacher   r   r-   r;   r>   rA   rG   r~   r   r   r   r   <module>r      s  ! !D # " " " " "                         " " " " " " % % % % % % & & & & & & 9 9 9 9 9 9 $ $ $ $ $ $%' %' %' %'PH H H HV     	   	
 	   	
 	; ; ; 	; 	'1 '1 '1 	'1T     r   