ó
    ‰*£hg  ã                  óì   • S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SS	KJr  SS
KJr  SS jrSS jrSS jr\SS j5       r\SS j5       r\SS j5       r\SS j5       rSS jrg)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)Úcacheitc                 óú   ^• U (       d  g[        U 5      S:X  a  SU S   4$ [        U 5      S:X  a  [        U S   U S   5      u  nmnUT4U4$ [        U SS 6 u  p4[        U S   U5      u  nmnU/U4S jU 5       Q7U4$ )a  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  ó.   >#   • U  H
  nTU-  v •  M     g 7f©Nr   )Ú.0ÚiÚvs     €Ún/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/functions/elementary/_trigonometric_special.pyÚ	<genexpr>Úmigcdex.<locals>.<genexpr>S   s   øé € Ð"¢˜1��Q–¢ùs   ƒ)Úlenr   Úmigcdex)ÚxÚuÚhÚyÚgr   s        @r   r   r   .   s–   ø€ ö2 Øä
ˆ1ƒv�ƒ{Ø�Q�q‘TˆzÐä
ˆ1ƒv�ƒ{Ü˜˜1™˜q ™tÓ$‰ˆˆ1ˆaØ�1ˆv�qˆyÐä�A�a�b�Eˆ?�D€AÜ�Q�q‘T˜1‹o�G€A€qˆ!ØÐ#Ô"¡Ó"Ñ# QÐ&Ð&ó    c                 ó|   • U (       d  gSS jn[        X5      nU  Vs/ s H  o2U-  PM	     nn[        U6 u  pVU$ s  snf )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   c                ó
   • X-  $ r   r   )r   r   s     r   ÚmulÚipartfrac.<locals>.mul˜   s	   € Ø‰uˆr    )r   Úintr   r%   Úreturnr%   )r   r   )Údenomsr#   Údenomr   Úar   Ú_s          r   Ú	ipartfracr+   V   sG   € ö~ Øôô �3Ó€EÙ#Ó$šV˜�!Œ™V€AÐ$Ü�Aˆ;�D€AØ€Hùò 	%s   �9c                ó~   • / nS H5  n[        X5      u  p4US:X  d  M  Un UR                  U5        U S:X  d  M3  Us  $    g)zqIf 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)ÚnÚprimesÚpÚquotientÚ	remainders        r   Úfermat_coordsr8   ¡   sH   € ð
 €FÛ#ˆÜ$ Q›lÑˆØ˜�>ØˆAØ�M‰M˜!ÔØ�A�vØ’ñ $ð r    c                 ó"   • [         R                  $ )z-Computes $\cos \frac{\pi}{3}$ in square roots)r   ÚHalfr   r    r   Úcos_3r;   ±   s   € ô �6‰6€Mr    c                 ó$   • [        S5      S-   S-  $ )z-Computes $\cos \frac{\pi}{5}$ in square rootsr.   r   é   r
   r   r    r   Úcos_5r>   ·   s   € ô �‹G�a‰K˜1ÑÐr    c                 óV  • [        S[        S5      -   S-  [        S5      [        S[        S5      -
  5      [        [        S5      S[        S[        S5      -   5      -  S[        S5      -
  [        S[        S5      -
  5      -  -
  -  S[        S5      -  -   S-   5      -   -  S-  -   5      $ )	z.Computes $\cos \frac{\pi}{17}$ in square rootsé   r/   é    r   iøÿÿÿr   é   é"   r
   r   r    r   Úcos_17rD   ½   s°   € ô Ø	Œd�2‹h‰˜"Ñœt A›w¬$¨r´D¸³H©}Ó*=ÜŒT�!‹W˜œT "¤t¨B£x¡-Ó0Ñ0°A¼¸R»±LÜ
ˆr”D˜“H‰}Ó
ñ4ñ ñ Ø!"¤T¨"£X¡ñ.Ø02ñ3ó 	4ñ+4ñ  5à79ñ :ñ 	:ó;ð ;r    c                 óÐ  • SS jn SS jnU " [         R                  [        S5      5      u  p#U " U[        S5      5      u  pEU " U[        S5      5      u  pgU " USSU-   SU-  -   -  5      u  p‰U " USSU-   SU-  -   -  5      u  p«U " USSU-   SU-  -   -  5      u  pÍU " USSU-   SU-  -   -  5      u  pïU " USX(-   U-   SU
-  -   -  5      u  nnU " USX;-   U-   SU-  -   -  5      u  nnU " USX,-   U	-   SU-  -   -  5      u  nnU " USX?-   U
-   SU-  -   -  5      u  nnU " U	SX)-   U-   SU-  -   -  5      u  nnU " U
SX:-   U-   SU-  -   -  5      u  nnU " USX--   U-   SU-  -   -  5      u  nnU " USX>-   U-   SU	-  -   -  5      u  nnU" USUU-   U-   U-   -  5      n U" USUU-   U-   U-   -  5      n!U" USUU-   U-   U-   -  5      n"U" USUU-   U-   U-   -  5      n#U" USUU-   U-   U-   -  5      n$U" USUU-   U-   U-   -  5      n%U" U * SU!U"-   -  5      * n&U" U#* SU$U%-   -  5      * n'S	U" U&* SU'-  5      -  n([        [        S5      [        U(S-   5      -  S
-  [         R                  -   5      $ )zí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
c                ó^   • U [        U S-  U-   5      -   S-  U [        U S-  U-   5      -
  S-  4$ ©Nr   r
   ©r)   Úbs     r   Úf1Úcos_257.<locals>.f1Ð   s9   € Ø”D˜˜A™ ™“NÑ" aÑ'¨!¬d°1°a±4¸!±8«nÑ*<ÀÑ)AÐAÐAr    c                ó0   • U [        U S-  U-   5      -
  S-  $ rG   r
   rH   s     r   Úf2Úcos_257.<locals>.f2Ó   s   € Ø”D˜˜A™ ™“NÑ" AÑ%Ð%r    é   é@   r=   r.   r   éüÿÿÿéþÿÿÿé   )r)   r   rI   r   r&   ztuple[Expr, Expr])r)   r   rI   r   r&   r   )r   ÚNegativeOner	   r   r:   ))rJ   rM   Ú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ô&ñ ”—‘œw s›|Ó,�F€BÙ�”G˜B“KÓ �F€BÙ�”G˜B“KÓ �F€BÙ��A�q˜2‘v  "¡‘}Ñ%Ó&�F€BÙ��A�q˜2‘v  "¡‘}Ñ%Ó&�F€BÙ��A�q˜2‘v  "¡‘}Ñ%Ó&�F€BÙ��A�q˜2‘v  "¡‘}Ñ%Ó&�F€BÙ��B˜™ "™ q¨¡tÑ+Ñ,Ó-�F€BˆÙ��R˜™ 2™¨¨"©Ñ,Ñ-Ó.�G€BˆÙ��R˜™ 2™¨¨"©Ñ,Ñ-Ó.�G€BˆÙ��R˜™ 2™¨¨"©Ñ,Ñ-Ó.�G€BˆÙ��R˜™ 2™¨¨"©Ñ,Ñ-Ó.�G€BˆÙ��R˜™ 2™¨¨"©Ñ,Ñ-Ó.�G€BˆÙ��R˜™ 2™¨¨"©Ñ,Ñ-Ó.�G€CˆÙ��R˜™ 2™¨¨"©Ñ,Ñ-Ó.�G€BˆÙ	ˆB��B˜‘G˜b‘L 2Ñ%Ñ&Ó	'€BÙ	ˆB��B˜‘G˜b‘L 2Ñ%Ñ&Ó	'€BÙ	ˆB��B˜‘G˜c‘M CÑ'Ñ(Ó	)€BÙ	ˆB��B˜‘H˜s‘N SÑ(Ñ)Ó	*€BÙ	ˆC��S˜3‘Y ‘_ sÑ*Ñ+Ó	,€BÙ	ˆC��S˜2‘X ‘] RÑ'Ñ(Ó	)€BÙ
ˆbˆS�"�b˜2‘g‘,Ó
Ð	€BÙ
ˆbˆS�"�b˜2‘g‘,Ó
Ð	€BØ	‰B�ˆs�B�r‘E‹NÑ	€BÜ”�Q“œ˜R !™V›Ñ$ QÑ&¬¯©Ñ/Ó0Ð0r    c                 ó0   • [         [        [        [        S.$ )aC  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
)r-   r.   r/   r0   )r;   r>   rD   r|   r   r    r   Ú	cos_tabler~   ñ   s   € ô  ÜÜÜñ	ð r    N)r   r%   r&   ztuple[tuple[int, ...], int])r'   r%   r&   ztuple[int, ...])r3   r%   r&   zlist[int] | None)r&   r   )r&   zdict[int, Callable[[], Expr]])Ú__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+   r8   r;   r>   rD   r|   r~   r   r    r   Ú<module>r‰      s�   ðñ!õD #Ý Ý Ý  Ý "Ý %Ý &Ý 9Ý $ô%'ôPHôVð  	óó 	ðð
 	óó 	ðð
 	ó;ó 	ð;ð 	ó'1ó 	ð'1õTr    