sd11 talk
system:sage

<center>
<img width=356 src="sage_logo.png">
<br>
<font color="#000099"><h1>Sage: Introduction and Status Report</h1></font>
<h2>Craig Citro</h2>
<h2>Sage Days 11</h2>
<br><br>

{{{id=3|
E = EllipticCurve('37a') ; E
///

Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
}}}

{{{id=6|
E.c_invariants()
///

(48, -216)
}}}

{{{id=23|
show(E)
///

<html><div class="math">y^2 + y = x^3 - x </div></html>
}}}

{{{id=8|
show(plot(E))
///
}}}

{{{id=7|
delta_qexp(50)
///

q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 - 16744*q^7 + 84480*q^8 - 113643*q^9 - 115920*q^10 + 534612*q^11 - 370944*q^12 - 577738*q^13 + 401856*q^14 + 1217160*q^15 + 987136*q^16 - 6905934*q^17 + 2727432*q^18 + 10661420*q^19 - 7109760*q^20 - 4219488*q^21 - 12830688*q^22 + 18643272*q^23 + 21288960*q^24 - 25499225*q^25 + 13865712*q^26 - 73279080*q^27 + 24647168*q^28 + 128406630*q^29 - 29211840*q^30 - 52843168*q^31 - 196706304*q^32 + 134722224*q^33 + 165742416*q^34 - 80873520*q^35 + 167282496*q^36 - 182213314*q^37 - 255874080*q^38 - 145589976*q^39 + 408038400*q^40 + 308120442*q^41 + 101267712*q^42 - 17125708*q^43 - 786948864*q^44 - 548895690*q^45 - 447438528*q^46 + 2687348496*q^47 + 248758272*q^48 - 1696965207*q^49 + O(q^50)
}}}

{{{id=0|
%time E4 = eisenstein_series_qexp(4,50000)
///

CPU time: 0.43 s,  Wall time: 0.43 s
}}}

{{{id=2|
ls = E4.list()
ls[:30]
///

[1/240, 1, 9, 28, 73, 126, 252, 344, 585, 757, 1134, 1332, 2044, 2198, 3096, 3528, 4681, 4914, 6813, 6860, 9198, 9632, 11988, 12168, 16380, 15751, 19782, 20440, 25112, 24390]
}}}

{{{id=4|
ls[-30:]
///

[141515639939520, 129404204871032, 142408295876742, 125256166932960, 145605951613080, 125819082506000, 142616700266040, 129628631599434, 140439456663030, 124855477070688, 149328544489488, 124857593850784, 140473649431368, 129497452357896, 142827602514912, 125943933626280, 145903606879842, 125269163112608, 142475493385602, 129562979818720, 141664967010000, 124932512149272, 148040896807440, 124947507349658, 140984218923552, 130898657464848, 142549755366240, 125002968793794, 145882205016912, 124992500150000]
}}}

{{{id=5|
eisenstein_series_qexp
///

<function eisenstein_series_qexp at 0x64511f0>
}}}

{{{id=22|
# Yoda! -- over 50,000 triangles.
from scipy import io
x = io.loadmat(DATA + 'yodapose.mat')
from sage.plot.plot3d.index_face_set import IndexFaceSet
V = x['V']; F3=x['F3']-1; F4=x['F4']-1
Y = IndexFaceSet(F3,V,color=Color('#00aa00')) + IndexFaceSet(F4,V,color=Color('#00aa00'))
Y = Y.rotateX(-1)
Y.show(aspect_ratio=[1,1,1], frame=False, figsize=4)
///
}}}

<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><hr>
<center>
<img src="python-and-cython.png">
</center>

{{{id=16|
%cython
a = 2
print 1+a
///

3
}}}

{{{id=17|
def mysum(N):
    s = 0
    for k in range(1,N):
        s += k
    return s
///
}}}

{{{id=18|
time mysum(10^6)
///

499999500000
CPU time: 1.76 s,  Wall time: 1.78 s
}}}

{{{id=19|
%cython

def mysum(N):
    s = 0
    for k in range(1,N):
        s += k
    return s
///
}}}

{{{id=20|
time mysum(10^6)
///

499999500000L
CPU time: 0.18 s,  Wall time: 0.18 s
}}}

{{{id=21|
%cython
def mysum(N):
    cdef int k
    cdef int my_N = N
    cdef long long s = 0
    for k from 1 <= k < my_N:
        s += k
    return s
///
}}}

{{{id=9|
time mysum(10^6)
///

499999500000L
CPU time: 0.00 s,  Wall time: 0.00 s
}}}

<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><hr>
<font color="#000099"><h1  align='center'>Interact</h1></font>

{{{id=15|
@interact
def gfan_browse(p1 = input_box('x^3+y^2',type = str, label='polynomial 1: '), 
                p2 = input_box('y^3+z^2',type = str, label='polynomial 2: '), 
                p3 = input_box('z^3+x^2',type = str, label='polynomial 3: ')):
    R.<x,y,z> = PolynomialRing(QQ,3)
    try:
        p1 = R(p1); p2 = R(p2); p3 = R(p3)
    except TypeError:
        print "Unable to parse input."
        return
    i1 = ideal(p1,p2,p3)
    alarm(2)
    try:
        gf1 = i1.groebner_fan()
        testr = gf1.render()    
        html('Groebner fan of the ideal generated by: $%s, %s, %s$'%(
               latex(p1), latex(p2), latex(p3)))
        show(testr, axes = False, figsize=[8,8*(3^(.5))/2])
    except:
        print "Computation took more than 2 seconds... and I know you are impatient, so stopping"
///

<html><!--notruncate--><div padding=6 id='div-interact-15'> <table width=800px height=20px bgcolor='#c5c5c5'
                 cellpadding=15><tr><td bgcolor='#f9f9f9' valign=top align=left><table><tr><td align=right><font color="black">polynomial 1: &nbsp;</font></td><td><input type='text' value='x^3+y^2' size=80 onchange='interact(15, "sage.server.notebook.interact.update(15, \"p1\", 10, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.value)+"\"), globals())")'></input></td></tr>
<tr><td align=right><font color="black">polynomial 2: &nbsp;</font></td><td><input type='text' value='y^3+z^2' size=80 onchange='interact(15, "sage.server.notebook.interact.update(15, \"p2\", 11, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.value)+"\"), globals())")'></input></td></tr>
<tr><td align=right><font color="black">polynomial 3: &nbsp;</font></td><td><input type='text' value='z^3+x^2' size=80 onchange='interact(15, "sage.server.notebook.interact.update(15, \"p3\", 12, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.value)+"\"), globals())")'></input></td></tr>
</table><div id='cell-interact-15'><?__SAGE__START>
        <table border=0 bgcolor='#white' width=100% height=100%>
        <tr><td bgcolor=white align=left valign=top><pre><?__SAGE__TEXT></pre></td></tr>
        <tr><td  align=left valign=top><?__SAGE__HTML></td></tr>
        </table><?__SAGE__END></div></td>
                 </tr></table></div>
                 </html>
}}}

{{{id=10|
var('x')
x0  = 0
f   = sin(x)*e^(-x)
p   = plot(f,-1,5, thickness=2)
dot = point((x0,f(x0)),pointsize=80,rgbcolor=(1,0,0))
@interact
def _(order=(1..12)):
  ft = f.taylor(x,x0,order)
  pt = plot(ft,-1, 5, color='green', thickness=2)
  html('$f(x)\;=\;%s$'%latex(f))
  html('$\hat{f}(x;%s)\;=\;%s+\mathcal{O}(x^{%s})$'%(x0,latex(ft),order+1))
  show(dot + p + pt, ymin = -.5, ymax = 1)
///

<html><!--notruncate--><div padding=6 id='div-interact-10'> <table width=800px height=20px bgcolor='#c5c5c5'
                 cellpadding=15><tr><td bgcolor='#f9f9f9' valign=top align=left><table><tr><td align=right><font color="black">order&nbsp;</font></td><td><table><tr><td>
    	<div id='slider-order-10' class='ui-slider-3' style='padding:0px;margin:0px;'><span class='ui-slider-handle'></span></div>
    	</td><td><font color='black' id='slider-order-10-lbl'></font></td></tr></table><script>(function(){ var values = ["1","2","3","4","5","6","7","8","9","10","11","12"]; setTimeout(function() {
    $('#slider-order-10').slider({
    	stepping: 1, minValue: 0, maxValue: 11, startValue: 0,
    	change: function () { var position = Math.ceil($('#slider-order-10').slider('value')); if(values!=null) $('#slider-order-10-lbl').text(values[position]); interact(10, "sage.server.notebook.interact.update(10, \"order\", 7, sage.server.notebook.interact.standard_b64decode(\""+encode64(position)+"\"), globals())"); },
    	slide: function() { if(values!=null) $('#slider-order-10-lbl').text(values[Math.ceil($('#slider-order-10').slider('value'))]); }
    });
    if(values != null) $('#slider-order-10-lbl').text(values[Math.ceil($('#slider-order-10').slider('value'))]);
    }, 1); })();</script></td></tr>
</table><div id='cell-interact-10'><?__SAGE__START>
        <table border=0 bgcolor='#white' width=100% height=100%>
        <tr><td bgcolor=white align=left valign=top><pre><?__SAGE__TEXT></pre></td></tr>
        <tr><td  align=left valign=top><?__SAGE__HTML></td></tr>
        </table><?__SAGE__END></div></td>
                 </tr></table></div>
                 </html>
}}}

{{{id=14|
var('x')
x0  = 0
@interact
def _(f=input_box(sin(x)*e^(-x)),order=(1..12)):
  p   = plot(f,-1,5, thickness=2)
  dot = point((x0,f(x0)),pointsize=80,rgbcolor=(1,0,0))
  ft = f.taylor(x,x0,order)
  pt = plot(ft,-1, 5, color='green', thickness=2)
  html('$f(x)\;=\;%s$'%latex(f))
  html('$\hat{f}(x;%s)\;=\;%s+\mathcal{O}(x^{%s})$'%(x0,latex(ft),order+1))
  show(dot + p + pt, ymin = -.5, ymax = 1)
///

<html><!--notruncate--><div padding=6 id='div-interact-14'> <table width=800px height=20px bgcolor='#c5c5c5'
                 cellpadding=15><tr><td bgcolor='#f9f9f9' valign=top align=left><table><tr><td align=right><font color="black">f&nbsp;</font></td><td><input type='text' value='e^(-x)*sin(x)' size=80 onchange='interact(14, "sage.server.notebook.interact.update(14, \"f\", 8, sage.server.notebook.interact.standard_b64decode(\""+encode64(this.value)+"\"), globals())")'></input></td></tr>
<tr><td align=right><font color="black">order&nbsp;</font></td><td><table><tr><td>
    	<div id='slider-order-14' class='ui-slider-3' style='padding:0px;margin:0px;'><span class='ui-slider-handle'></span></div>
    	</td><td><font color='black' id='slider-order-14-lbl'></font></td></tr></table><script>(function(){ var values = ["1","2","3","4","5","6","7","8","9","10","11","12"]; setTimeout(function() {
    $('#slider-order-14').slider({
    	stepping: 1, minValue: 0, maxValue: 11, startValue: 0,
    	change: function () { var position = Math.ceil($('#slider-order-14').slider('value')); if(values!=null) $('#slider-order-14-lbl').text(values[position]); interact(14, "sage.server.notebook.interact.update(14, \"order\", 9, sage.server.notebook.interact.standard_b64decode(\""+encode64(position)+"\"), globals())"); },
    	slide: function() { if(values!=null) $('#slider-order-14-lbl').text(values[Math.ceil($('#slider-order-14').slider('value'))]); }
    });
    if(values != null) $('#slider-order-14-lbl').text(values[Math.ceil($('#slider-order-14').slider('value'))]);
    }, 1); })();</script></td></tr>
</table><div id='cell-interact-14'><?__SAGE__START>
        <table border=0 bgcolor='#white' width=100% height=100%>
        <tr><td bgcolor=white align=left valign=top><pre><?__SAGE__TEXT></pre></td></tr>
        <tr><td  align=left valign=top><?__SAGE__HTML></td></tr>
        </table><?__SAGE__END></div></td>
                 </tr></table></div>
                 </html>
}}}

<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><hr>
<font color="#000099"><h1  align='center'>Parallel Computing</h1></font>

{{{id=11|
N = 2^217-1
M = 2^218-1
ls = [N,M]
///
}}}

{{{id=25|
%time factor(N)
///

127 * 5209 * 62497 * 2147483647 * 6268703933840364033151 * 378428804431424484082633
CPU time: 1.00 s,  Wall time: 1.07 s
}}}

{{{id=26|
def f(n):
    return factor(n)
///
}}}

{{{id=27|
%time [ f(x) for x in ls ]
///

[127 * 5209 * 62497 * 2147483647 * 6268703933840364033151 * 378428804431424484082633, 3 * 104124649 * 745988807 * 870035986098720987332873 * 2077756847362348863128179]
CPU time: 2.29 s,  Wall time: 2.43 s
}}}

{{{id=28|
@parallel(2)
def f_para(n):
    return factor(n)
///
}}}

{{{id=29|
%time list(f_para(ls))
///

[(((210624583337114373395836055367340864637790190801098222508621955071,), {}), 127 * 5209 * 62497 * 2147483647 * 6268703933840364033151 * 378428804431424484082633), (((421249166674228746791672110734681729275580381602196445017243910143,), {}), 3 * 104124649 * 745988807 * 870035986098720987332873 * 2077756847362348863128179)]
CPU time: 0.03 s,  Wall time: 1.41 s
}}}