;ò
ġÙR?c           @   sË   d  Z  d Z d k l Z d f  d     YZ e d d  Z d e f d     YZ e   Z [ d e e Z d	 e f d
     YZ	 d e f d     YZ
 e	   e
   f \ Z Z [	 [
 [ [ [ [ d Z d S(   s   Sinusoids of multiples of angles, via polynomials.

See S and C for details, or
http://www.chaos.org.uk/~eddy/math/multiangle.html
for theory.
s:   
$Id: multiangle.py,v 1.10 2003/09/01 05:32:37 eddy Exp $
(   s
   Polynomials   LazySeqc           B   sA   t  Z e d  d  Z d   Z d   Z d   Z d d  Z RS(   Ni   c         C   s   | g |  _ d  S(   N(   s   firsts   selfs   _LazySeq__seq(   s   selfs   first(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   __init__   s    c         C   sı   |  i |  } t oL | i } x@ | d j o. |  i | i |   p t	  | d } q" Wn | t
 |  i  j o, |  i t g d | t
 |  i  |  _ n | |  i | <| Sd  S(   Ni    i   (   s   selfs   growtos   keys   vals	   __debug__s   ranks   is   checks   coefficients   AssertionErrors   lens   _LazySeq__seqs   None(   s   selfs   keys   vals   i(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   __growto   s    	  ,c         C   s   | t |  j Sd  S(   N(   s   vals   long(   s   selfs   val(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   check!   s    c         C   sZ   y |  i | } Wn  t j
 o |  i |  Sn  X| t j o |  i |  Sn | Sd  S(   N(   s   selfs   _LazySeq__seqs   keys   anss
   IndexErrors   _LazySeq__growtos   None(   s   selfs   keys   ans(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   __getitem__#   s      c         C   s­   g  } | d j o4 x | | j  o | i |  |  | | } q Wn_ | d j  o4 xN | | j o | i |  |  | | } qW Wn | | j o t d   n | Sd  S(   Ni    s,   Sequence with zero step is a very bad idea !(   s   anss   steps   los   his   appends   selfs
   ValueError(   s   selfs   los   his   steps   ans(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   __getslice__,   s      (   s   __name__s
   __module__s
   Polynomials   __init__s   _LazySeq__growtos   checks   __getitem__s   __getslice__(    (    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   LazySeq   s
   				i    i   s   Middlec           B   se   t  Z h  d e d <d d e <e d e d e e d e d  e d  e d  f d  Z RS(   Ni    i   i   c         C   s*   |  |  |  | d  i | d |  S(   Ni   (   s   ps   xs   unafter(   s   ps   x(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   <lambda>@   s    c         C   s.   |  | | d d  | d d | d d S(   Ni   i   i   f0.5(   s   ps   x(   s   ps   x(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   <lambda>A   s    c         C   s+   d | d |  | d  d | d d S(   Ni   i   i   i   f0.5(   s   xs   p(   s   ps   x(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   <lambda>B   s    c         C   sÙ   t  |  j p t  t | d  \ } }
 | |
 d }	 | d | |	 d j p t  |  | |  |	 f \ } } d | | |	 d | |  | |  | | | d  | } t | d  |  p t  | Sd  S(   Ni   i   i   f0.5c         C   s   |  |  | j S(   N(   s   ps   a(   s   ps   a(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   <lambda>I   s    (   s   Ks   selfs   AssertionErrors   divmods   keys   ns   rs   ms   thiss   thats   downs   slabs   twos   ups   anss   filters   checks(   s   selfs   keys   downs   ups   twos   slabs   checkss   thats   thiss   ms   rs   anss   n(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   growto>   s     B(   s   __name__s
   __module__s   zs   growto(    (    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   Middle=   s   s   seqCosc           B   s)   t  Z d  Z d d e e e d  Z RS(   s\   Sequence of polynomials describing cos(n.t) in terms of cos(t)

    C[n](cos(t)) = cos(n.t)
i   i   c         C   sc   t  | d  \ } } | o | t | |  } n |  | |  } | i
 | j p t  | Sd  S(   Ni   (   s   divmods   keys   ns   rs   xs   Ks   kates   anss   selfs   terms   ranks   AssertionError(   s   selfs   keys   kates   terms   xs   ns   rs   ans(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   growtoU   s     (   s   __name__s
   __module__s   __doc__s   terms   zs   growto(    (    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   seqCosQ   s    s   seqSinc           B   s(   t  Z d  Z d e d e e d  Z RS(   sk   Sequence of polynomials describing sin(n.t)/sin(t) in terms of cos(t)

    sin(t)*S[n](cos(t)) == sin(n.t)
i   i   c         C   s   t  | d  \ } } | o d | t | |  } n/ t | |  h  d d <d d <| d } | i
 | j p t  | Sd  S(   Ni   i    i   i˙˙˙˙(   s   divmods   keys   ns   rs   xs   Ss   terms   anss   Ks   stems   ranks   AssertionError(   s   selfs   keys   stems   terms   xs   ns   rs   ans(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   growtob   s     .(   s   __name__s
   __module__s   __doc__s   terms   zs   growto(    (    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   seqSin]   s    sô  
$Log: multiangle.py,v $
Revision 1.10  2003/09/01 05:32:37  eddy
Little tweaks.  Defined term more clearly; deployed it more.  Renamed z
to x when tunnelling it.  Delete LazySeq when used.

Revision 1.9  2003/09/01 05:25:43  eddy
Changed Middle to use addition-derived formulae.  Refined a check.

Revision 1.8  2003/08/17 20:25:35  eddy
Added some assertions to Middle.

Revision 1.7  2003/08/13 22:15:12  eddy
Fixed d'oh; wrong sign for the term used by Cos.

Revision 1.6  2003/08/12 22:57:43  eddy
Eliminated A, B, Q, R in favour of K and halvings through S and C;
i.e. I have now proved B-Q unification (and renamed T and D to K), along
with eliminating A and R as mere aspects of C and S (respectively).

Revision 1.5  2003/08/10 20:45:02  eddy
Added implementation of the polynomial that unifies Q and B, albeit I haven't
yet *proved* it does so.  The assertions make me confident, though ;^>

Revision 1.4  2003/08/10 12:45:42  eddy
Renumbered S down by 1, so S[n].rank is n.
Added assorted assertions.

Revision 1.3  2003/08/10 11:47:33  eddy
Fixed the S[1] tweak so it's lambda x: 1, not lambda x: x - d'oh !

Revision 1.2  2003/08/05 21:42:34  eddy
Tweaked so S[1] is a polynomial, not 1.0; added comments.

Initial Revision 1.1  2003/08/03 23:21:14  eddy
N(   s   __doc__s   _rcs_id_s
   polynomials
   Polynomials   LazySeqs   zs   Middles   Ks   terms   seqCoss   seqSins   Cs   Ss	   _rcs_log_(   s   terms   LazySeqs   _rcs_id_s   Ks   Cs   Middles   Ss   seqCoss
   Polynomials   zs	   _rcs_log_s   seqSin(    (    s,   /home/eddy/.sys/py/study/maths/multiangle.pys   ?   s   -			