Introduccion_a_SAGE
system:sage


<p style="text-align: center;"><img src="sage_banner.png" alt="Banner de Sage" height="600" /></p>

{{{id=222|

///
}}}

<h3>Sage es software libre</h3>
<ul>
<li>Es gratis para el profesor (licencia acad&eacute;mica de Matlab: 500&euro;).</li>
<li>Es gratis para los alumnos mientras estudian (licencia de estudiante de Matlab: 90).</li>
<li>Es gratis para los alumnos cuando dejan de estudiar (licencia comercial de Matlab: 2000&euro;, toolboxes aparte).</li>
<li>Siempre ser&aacute; <strong>gratis</strong> (al contrario que MUPAD, por ejemplo).</li>
<li>Puedes usarlo de cualquier forma (PC, cliente-servidor, supercomputadoras)</li>
<li>Es posible <strong>revisar el c&oacute;digo</strong>. Si por ejemplo, comparamos la velocidad de un algoritmo frente a otro distinto, toda la informaci&oacute;n est&aacute; a la vista de potenciales referees.</li>
<li>Los <strong>errores</strong> se discuten p&uacute;blicamente y se corrigen lo antes posible. La versi&oacute;n corregida est&aacute; disponible para todo el mundo tan pronto como est&eacute; disponible.</li>
<li>Podemos <strong>adaptar Sage a nuestras necesidades</strong> (ej: <strong>traducciones</strong>, live dvd con Sage, <a title="FEMhub" href="http://femhub.org/" target="_blank">FEMhub</a>)</li>
<li>Podemos desarrollar nuestro c&oacute;digo dentro de Sage, usando todas sus capacidades (ej: <a title="sage combinat" href="http://wiki.sagemath.org/combinat/">sage combinat</a>)</li>
</ul>

{{{id=286|

///
}}}

<h3>&iquest;Qui&eacute;n hace Sage?</h3>
<ul>
<li>William Stein comienza el proyecto en 2005  (<a href="http://sagemath.blogspot.com/2009/12/mathematical-software-and-me-very.html" target="_blank">http://sagemath.blogspot.com/2009/12/mathematical-software-and-me-very.html</a>).</li>
<li>En 2006, se realiza el primer encuentro Sage Days, y se distribuye  la primera versi&oacute;n de Sage.</li>
<li>En 2007, Sage gana el primer premio de los Trophees du Libre.</li>
<li>Desarrollado por cualquiera que quiera colaborar, en cualquier parte  del  mundo:   profesores de matem&aacute;ticas, estudiantes, ingenieros...</li>
<li><strong>Financiaci&oacute;n</strong> por parte de universidades y empresas, becas para  trabajar en Sage...</li>
</ul>
<h3>El proceso de desarrollo</h3>
<ul>
<li>Todo el c&oacute;digo (desde 2007) debe ser <strong>revisado</strong> por otra persona distinta del autor.</li>
<li>El c&oacute;digo nuevo debe estar cubierto por <strong>tests autom&aacute;ticos</strong>. De esta forma se evita que un cambio en una parte del programa estropee otra parte distinta.</li>
<li>La documentaci&oacute;n tambi&eacute;n se comprueba autom&aacute;ticamente, para asegurar que los ejemplos sigan funcionando.</li>
<li>Todo esto es muy importante, porque Sage es joven, y necesita cambiar si tiene que ser &uacute;til a una comunidad heterog&eacute;nea.</li>
</ul>
<h3>&iquest;D&oacute;nde est&aacute; la comunidad de desarrolladores?</h3>
<ul>
<li><strong>Sage days</strong>: reuniones peri&oacute;dicas donde se habla de Sage en  general, y a menudo se busca alg&uacute;n prop&oacute;sito espec&iacute;fico.</li>
<li>Listas de correo:            
<ul>
<li><strong><tt><span>sage-devel</span></tt></strong>:  <a href="http://groups.google.com/group/sage-devel">http://groups.google.com/group/sage-devel</a> (1220 usuarios el 09/07/2010)</li>
<li><strong><tt><span>sage-support</span></tt></strong>:  <a href="http://groups.google.com/group/sage-support">http://groups.google.com/group/sage-support</a> (1792 usuarios el 09/07/2010)</li>
<li><strong><tt><span>sage-edu, </span></tt></strong><strong><tt><span>sage-notebook,  sage-algebra, ...<br /></span></tt></strong></li>
</ul>
</li>
<li>IRC: <tt><span>#sage-devel</span></tt> en freenode</li>
<li>Rastreador de errores: <a href="http://trac.sagemath.org/sage_trac/">http://trac.sagemath.org/sage_trac/</a></li>
</ul>

{{{id=288|

///
}}}

{{{id=287|

///
}}}

{{{id=5|

///
}}}

<h3>&iquest;C&oacute;mo es Sage por dentro?</h3>
<p>Sage usa el lenguaje <strong>python</strong> para integrar librer&iacute;as de matem&aacute;ticas existentes de una forma consistente. Tambi&eacute;n se escribe <em>c&oacute;digo nuevo</em> en python, y en <strong>cython</strong> cuando se necesita m&aacute;s velocidad.</p>
<p><img src="sagecar.png" alt="sage builds the car" width="854" height="364" /></p>
<h4>Paquetes de Matem&aacute;ticas inclu&iacute;dos en SAGE</h4>
<table class="wikitable" border="0">
<tbody>
<tr>
<td>&Aacute;lgebra</td>
<td><a title="GAP computer algebra system" href="http://en.wikipedia.org/wiki/GAP_computer_algebra_system">GAP</a>, <a title="Maxima (software)" href="http://en.wikipedia.org/wiki/Maxima_%28software%29">Maxima</a>, <a title="SINGULAR" href="http://en.wikipedia.org/wiki/SINGULAR">Singular</a></td>
</tr>
<tr>
<td>Geometr&iacute;a Algebraica<br /></td>
<td><a title="SINGULAR" href="http://en.wikipedia.org/wiki/SINGULAR">Singular</a></td>
</tr>
<tr>
<td>Aritm&eacute;tica de Precisi&oacute;n Arbitraria</td>
<td><a title="GNU Multi-Precision Library" href="http://en.wikipedia.org/wiki/GNU_Multi-Precision_Library">GMP</a>, <a title="MPFR" href="http://en.wikipedia.org/wiki/MPFR">MPFR</a>, <a title="MPFR" href="http://en.wikipedia.org/wiki/MPFR">MPFI</a>, <a title="Number Theory Library" href="http://en.wikipedia.org/wiki/Number_Theory_Library">NTL</a></td>
</tr>
<tr>
<td>Geometr&iacute;a Aritm&eacute;tica</td>
<td><a title="PARI/GP" href="http://en.wikipedia.org/wiki/PARI/GP">PARI/GP</a>, <a title="Number Theory Library" href="http://en.wikipedia.org/wiki/Number_Theory_Library">NTL</a>, <a title="Mwrank" href="http://en.wikipedia.org/wiki/Mwrank">mwrank</a>, <a title="Lenstra elliptic curve factorization" href="http://en.wikipedia.org/wiki/Lenstra_elliptic_curve_factorization">ecm</a></td>
</tr>
<tr>
<td>C&aacute;lculo</td>
<td><a title="Maxima (software)" href="http://en.wikipedia.org/wiki/Maxima_%28software%29">Maxima</a>, <a title="SymPy" href="http://en.wikipedia.org/wiki/SymPy">SymPy</a>, <a title="GiNaC" href="http://en.wikipedia.org/wiki/GiNaC">GiNaC</a></td>
</tr>
<tr>
<td>Combinatoria</td>
<td><a title="Symmetrica" href="http://en.wikipedia.org/wiki/Symmetrica">Symmetrica</a>, Sage-Combinat</td>
</tr>
<tr>
<td>&Aacute;lgebra Linear</td>
<td><a title="Automatically Tuned Linear Algebra Software" href="http://en.wikipedia.org/wiki/Automatically_Tuned_Linear_Algebra_Software">ATLAS</a>, <a class="mw-redirect" title="BLAS" href="http://en.wikipedia.org/wiki/BLAS">BLAS</a>, <a title="LAPACK" href="http://en.wikipedia.org/wiki/LAPACK">LAPACK</a>, <a title="NumPy" href="http://en.wikipedia.org/wiki/NumPy">NumPy</a>, <a title="LinBox" href="http://en.wikipedia.org/wiki/LinBox">LinBox</a>, <a title="Integer Matrix Library" href="http://en.wikipedia.org/wiki/Integer_Matrix_Library">IML</a>, <a title="GNU Scientific Library" href="http://en.wikipedia.org/wiki/GNU_Scientific_Library">GSL</a></td>
</tr>
<tr>
<td>Teor&iacute;a de Grafos</td>
<td><a title="NetworkX" href="http://en.wikipedia.org/wiki/NetworkX">NetworkX</a></td>
</tr>
<tr>
<td>Teor&iacute;a de Grupos</td>
<td><a title="GAP computer algebra system" href="http://en.wikipedia.org/wiki/GAP_computer_algebra_system">GAP</a></td>
</tr>
<tr>
<td>C&aacute;lculo Num&eacute;rico</td>
<td><a title="GNU Scientific Library" href="http://en.wikipedia.org/wiki/GNU_Scientific_Library">GSL</a>, <a title="SciPy" href="http://en.wikipedia.org/wiki/SciPy">SciPy</a>, <a title="NumPy" href="http://en.wikipedia.org/wiki/NumPy">NumPy</a>, <a title="Automatically Tuned Linear Algebra Software" href="http://en.wikipedia.org/wiki/Automatically_Tuned_Linear_Algebra_Software">ATLAS</a></td>
</tr>
<tr>
<td>Teor&iacute;a de N&uacute;meros</td>
<td><a title="PARI/GP" href="http://en.wikipedia.org/wiki/PARI/GP">PARI/GP</a>, <a class="mw-redirect" title="FLINT" href="http://en.wikipedia.org/wiki/FLINT">FLINT</a>, <a title="Number Theory Library" href="http://en.wikipedia.org/wiki/Number_Theory_Library">NTL</a></td>
</tr>
<tr>
<td>Estad&iacute;stica<br /></td>
<td><a title="R (programming language)" href="http://en.wikipedia.org/wiki/R_%28programming_language%29">R</a>, <a title="SciPy" href="http://en.wikipedia.org/wiki/SciPy">SciPy</a></td>
</tr>
</tbody>
</table>
<table class="wikitable" border="0">
<h4 id="auto-3">Otros paquetes inclu&iacute;dos en SAGE</h4>
<tbody>
<tr>
<td>L&iacute;nea de Comandos</td>
<td><a title="IPython" href="http://en.wikipedia.org/wiki/IPython">IPython</a></td>
</tr>
<tr>
<td>Bases de datos<br /></td>
<td><a class="mw-redirect" title="ZODB" href="http://en.wikipedia.org/wiki/ZODB">ZODB</a>, <a title="Pickle (Python)" href="http://en.wikipedia.org/wiki/Pickle_%28Python%29">Python Pickles</a>, <a title="SQLite" href="http://en.wikipedia.org/wiki/SQLite">SQLite</a></td>
</tr>
<tr>
<td>Interfaces gr&aacute;ficas<br /></td>
<td>Sage Notebook, <a class="mw-redirect" title="Jsmath" href="http://en.wikipedia.org/wiki/Jsmath">jsmath</a>, <a title="jQuery" href="http://en.wikipedia.org/wiki/JQuery">jQuery</a></td>
</tr>
<tr>
<td>Gr&aacute;ficos</td>
<td><a title="Matplotlib" href="http://en.wikipedia.org/wiki/Matplotlib">Matplotlib</a>, <a class="new" title="Tachyon3d (page does not exist)" href="http://en.wikipedia.org/w/index.php?title=Tachyon3d&amp;action=edit&amp;redlink=1">Tachyon3d</a>, <a title="GD" href="http://en.wikipedia.org/wiki/GD">GD</a>, <a title="Jmol" href="http://en.wikipedia.org/wiki/Jmol">Jmol</a></td>
</tr>
<tr>
<td>Lenguaje de programaci&oacute;n</td>
<td>
<p><a title="Python (programming language)" href="http://en.wikipedia.org/wiki/Python_%28programming_language%29">Python</a>, <a title="Cython" href="http://en.wikipedia.org/wiki/Cython">Cython</a></p>
</td>
</tr>
<tr>
<td>Networking</td>
<td><a title="Twisted (software)" href="http://en.wikipedia.org/wiki/Twisted_%28software%29">Twisted</a></td>
</tr>
<tr>
<td>Etc&eacute;tera</td>
<td><a title="Paquetes est&aacute;ndar" href="http://wiki.sagemath.org/Sage_Spkg_Tracking">Paquetes est&aacute;ndar</a><br /></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>

{{{id=2|

///
}}}

{{{id=1|

///
}}}

<h3>Usa python en vez de inventar su propio lenguaje</h3>
<p>Usar un lenguaje popular y sofisticado tiene muchas ventajas:</p>
<ul>
<li>Programaci&oacute;n orientada a objetos, especificaci&oacute;n de listas por comprensi&oacute;n, generadores, excepciones...</li>
<li>Python tambi&eacute;n es Open Source: la comunidad propone y discute la evoluci&oacute;n del lenguaje. Esto garantiza que el lenguaje mejora sin dejar de ser &uacute;til para tareas de todo tipo.</li>
<li><strong>Enorme cantidad de librer&iacute;as</strong> implementando servidores web, conexi&oacute;n con bases de datos, compiladores...</li>
<li>Muchos paquetes cient&iacute;ficos escriben interfaces con python independientemente de Sage.</li>
<li>Estamos ense&ntilde;ando a los alumnos un lenguaje que podr&aacute;n usar en un trabajo.</li>
</ul>
<p><img src="python.png" alt="" width="240" /></p>

{{{id=290|
#La indentación marca el principio y el final de los bloques
n = 17
while n != 1:
    print n, 
    if n%2 == 0:
        n /= 2
    else:
        n = 3*n + 1
print 1
///
}}}

{{{id=289|
#python es dinámico: no necesitamos saber el tipo de datos
#al escribir el código
def suma(a,b):
    return a + b

print suma(1,1)
var('x')
show( suma(sin(x), exp(x)) )
show( suma(graphs.HouseGraph(), graphs.CubeGraph(3)) )
///
}}}

{{{id=257|
#python es orientado a objetos
#Cada dato tiene un tipo de datos, con sus propios métodos

g = graphs.CubeGraph(3)
print type(g)
show(g,layout='spring')

M = g.adjacency_matrix()
print type(M)
show(M)

p = M.characteristic_polynomial()
print type(p)
show(p)
///
}}}

{{{id=251|
#list comprehension

#todos los primos menores que 100 que son de la forma z^2+1
print [p for p in prime_range(100) if (p-1).is_square()]

#el numero de lados de cada CubeGraph para k<10
#(número de aristas de un cubo k-dimensional)
print [graphs.CubeGraph(k).num_edges() for k in range(2,10) ]
///
}}}

{{{id=248|
#ejemplo con "generator expression"
#suma de los inversos de los primos menores que 100
#nota: es un numero racional
sum(1/p for p in prime_range(100) )
///
}}}

{{{id=237|
#hay algun numero primo de la forma 2k+1 con k entre A y B?
A = 1000
B = 2000
print any(is_prime(2*k+1) for k in range(A, B))

#Al usar un generador, no se emplea tiempo en comprobar si todos 
#los números entre A y B son primos.
#La ejecución se detiene cuando se encuentra el primer número primo
///
}}}

{{{id=249|
#Jerarquía de errores
A = matrix(QQ,[[1,1,0],[2,2,0]])
v = vector(QQ,[1,0])
A.solve_right(v)
///
}}}

{{{id=239|
A = matrix(QQ,[[2,0],[1,3]])
v = vector(CDF,[i,0])
A.solve_right(v)
///
}}}

{{{id=240|
A = matrix(QQ,[[2,0],[1,3]])
v = vector(CDF,[1,0])
try:
    print A.solve_right(v)
except TypeError:
    print A.base_extend(CDF).solve_right(v)
///
}}}

{{{id=274|
A = matrix(QQ,[[1,1,0],[2,2,0]])
v = vector(QQ,[1,0])
try:
    print A.solve_right(v)
except TypeError:
    print A.base_extend(CDF).solve_right(v)
///
}}}

<h3>Documentaci&oacute;n en varios formatos &uacute;tiles</h3>
<ul>
<li>El tabulador [Tab] sugiere formas de completar un comando.</li>
<li>Las sugerencias se limitan a las variables miembro y m&eacute;todos propios de cada variable o tipo de datos</li>
<li>Escribe el comando seguido de una interrogaci&oacute;n para ver la ayuda (<span style="font-family: courier new,courier;"><strong>comando?</strong></span>)</li>
<li>Dos interrogaciones para ver el c&oacute;digo fuente (<span style="font-family: courier new,courier;"><strong>comando??</strong></span>)</li>
<li>El link de ayuda ("Help") en lo alto del navegador muestra ayuda compilada a html y pdf (requiere ejecutar <span style="font-family: courier new,courier;">sage --docbuild all pdf</span>)</li>
</ul>

{{{id=375|

///
}}}

{{{id=234|
VectorSpace?
///
}}}

{{{id=291|
is_power_of_two??
///
}}}

{{{id=241|

///
}}}

<h3>La separaci&oacute;n de cliente y servidor ofrece muchas posibilidades</h3>
<ul>
<li>Una sala de ordenadores anticuados puede volver a la vida con un servidor potente.</li>
<li>Acceso a capacidad de c&oacute;mputo desde cualquier lugar (incluso desde tu tel&eacute;fono m&oacute;vil).</li>
<li>Una forma c&oacute;moda de mostrar tu trabajo, a tus colegas o al mundo entero.</li>
<li>Instalar Sage en un "supercomputador", y ejecutar c&oacute;digo remotamente es tan c&oacute;modo como hacerlo en tu propio ordenador.</li>
</ul>

{{{id=294|

///
}}}

{{{id=243|

///
}}}

<h3>Crea interacciones en el navegador que se pueden usar sin saber programar</h3>

{{{id=246|
#No es necesario entender el código para usar un "interact"
var('x')

@interact
def mi_taylor(f = ("f(x)=",sin(x)), 
              intervalo = range_slider(0,10,default=(0,1)),
              a = ("punto",(0,(0,10))),
              orden = ("Orden del polinomio",(1,(0..10)))#slider(0,10,1,default = 1)
              ):
    f_taylor = f.taylor(x,a,orden)
    x0, x1 = intervalo
    x0 = min(x0,a)
    x1 = max(x1,a)
    show(f)
    show(f_taylor)
    (plot(f,x,x0,x1) + 
     plot(f_taylor,x,x0,x1,color='red') +
     point2d((a,f(x=a)), pointsize= 30, color='green')
    ).show()
///
}}}

{{{id=259|
#Otro ejemplo, usando el nuevo editor de grafos interactivo

g = graphs.HouseGraph()
graph_editor(g);
///
}}}

{{{id=258|
#Siguen cálculos relacionados con el número cromático y el polinomio cromático

numero_cromatico = g.chromatic_number()
K = numero_cromatico + 2
print 'Número cromático: %d'%numero_cromatico
#H = g.coloring(hex_colors=True, algorithm="MILP")
H = g.coloring(hex_colors=True)
p = g.chromatic_polynomial()
g.plot(vertex_colors=H).show()
vs = [p(x=j) for j in range(K)]
print 'Polinomio cromático'
show(p)
(point([(j,p(x=j)) for j in range(K+1)], pointsize=30, color='red') + 
 plot(p,0,K)).show()
for j in range(K+1):
    print j,':',p(x=j)
///
}}}

{{{id=282|

///
}}}

{{{id=226|

///
}}}

<h3>Una forma r&aacute;pida de instalar mucho software cient&iacute;fico</h3>
<p>Instalando Sage instalas octave, maxima, singular, GAP ...</p>
<p>(como consecuencia, Sage es bastante grande (~2.5GB) )</p>
<h4>sage -maxima</h4>
<pre>;;; Loading #P"/home/moriarty/sage/local/lib/ecl/defsystem.fas"<br />;;; Loading #P"/home/moriarty/sage/local/lib/ecl/cmp.fas"<br />;;; Loading #P"/home/moriarty/sage/local/lib/ecl/sysfun.lsp"<br />Maxima 5.20.1 http://maxima.sourceforge.net<br />using Lisp ECL 10.2.1<br />Distributed under the GNU Public License. See the file COPYING.<br />Dedicated to the memory of William Schelter.<br />The function bug_report() provides bug reporting information.<br />(%i1)<br /></pre>
<h4>sage -R</h4>
<pre><br />R version 2.10.1 (2009-12-14)<br />Copyright (C) 2009 The R Foundation for Statistical Computing<br />ISBN 3-900051-07-0<br /><br />R es un software libre y viene sin GARANTIA ALGUNA.<br />Usted puede redistribuirlo bajo ciertas circunstancias.<br />Escriba 'license()' o 'licence()' para detalles de distribucion.<br /><br />R es un proyecto colaborativo con muchos contribuyentes.<br />Escriba 'contributors()' para obtener m&aacute;s informaci&oacute;n y<br />'citation()' para saber c&oacute;mo citar R o paquetes de R en publicaciones.<br /><br />Escriba 'demo()' para demostraciones, 'help()' para el sistema on-line de ayuda,<br />o 'help.start()' para abrir el sistema de ayuda HTML con su navegador.<br />Escriba 'q()' para salir de R.<br /><br />&gt;<br /></pre>
<p><strong>etcetera...</strong></p>

{{{id=262|

///
}}}

<h3><span id="cell_outer_223">Interacci&oacute;n via web con otros programas</span></h3>
<p>Puedes usar otros programas desde el notebook.</p>
<h4><span>PARI+GP seleccionando gp en el desplegable de lenguaje:<br /></span></h4>
<p style="text-align: center;"><span style="color: #333333;"><img src="parinb.png" alt="" width="880" height="633" /><br /></span></p>

{{{id=215|
%r
#Escribiendo %r al principio del cuadro de comandos,
#el código que sigue es de R, no de sage

a <- c(260, 316, 111, 93, 136, 278, 258, 155, 197, 102)
b <- c(530, 657, 243, 195, 286, 559, 546, 348, 430, 233)
stem(a)

#Para guardar las imagenes en el notebook, usamos los
#comandos de R necesarios para guardar la imagen
png('rplot.png')
plot(a,b)
abline(lm(b ~ a))
dev.off()
///
}}}

<h3>Combinar software muy diverso de forma armoniosa</h3>
<ul>
<li>Por supuesto, lo m&aacute;s interesante es llamar a todo este software usando python, y no tener que aprender lenguaje distintos.</li>
<li>Este objetivo todav&iacute;a no se ha terminado. Algunas librer&iacute;as est&aacute;n muy bien integradas (Singular, PARI...), otras no del todo (scipy, matplotlib...), otras m&aacute;s bien no (R, octave...)</li>
</ul>

{{{id=299|
var('x y')
f = sin(y)*x + e^(-x^2)

#Usa maxima
assume(x != 0)
a = f.integrate(y,0,x^2).integrate(x,0,1)
show(a)
///
}}}

{{{id=301|
#Usa PARI
a.n().sage
///
}}}

{{{id=300|
#Usa matplotlib
show( contour_plot(f,(x,-1,1),(y,-1,1)), aspect_ratio=1 )
///
}}}

{{{id=305|
#Usa tachyon, un trazador de rayos
show( plot3d(f,(x,-1,1),(y,-1,1)), viewer='tachyon')
///
}}}

{{{id=298|
#scipy no está completamente integrado
#antes de poder usar alguna funcionalidad muy interesante
#hay que importar scipy

from scipy.integrate import dblquad
dblquad(lambda y0,x0: sin(y0)*x0 + e^(-x0^2), 0, 1, lambda x0:0, lambda x0: x0^2 )
///
}}}

{{{id=269|

///
}}}

<h3>Mejora tu c&oacute;digo sin apenas cambiar de lenguaje</h3>
<ul>
<li>python es un lenguaje din&aacute;mico, y eso es muy c&oacute;modo, pero el precio a pagar es la eficiencia</li>
<li><strong>cython</strong> permite compilar c&oacute;digo con sintaxis id&eacute;ntica a la de python</li>
<li>Para acelerar los c&aacute;lculos, es necesario declarar los tipos de las variables</li>
<li>La optimizaci&oacute;n se hace de manera progresiva, no tienes que reescribir tu c&oacute;digo para hacerlo m&aacute;s eficiente: "first make it right, then make it fast"</li>
</ul>
<p><img src="cython.png" alt="" width="220" /></p>

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

{{{id=12|
time mysum(10^7)
///
}}}

{{{id=267|
%cython
def mysum_cython1(N):
    s = 0
    for k in range(N): 
        s += k
    return s
///
}}}

{{{id=266|
time mysum_cython1(10^7)
///
}}}

{{{id=247|
%cython
def mysum_cython2(int N):
    cdef int k
    cdef long long s = 0
    for k in range(N): 
        s += k
    return s
///
}}}

{{{id=264|
time mysum_cython2(10^7)
///
}}}

<h3>Aprovecha la infraestructura para desarrollar tu propio c&oacute;digo</h3>
<ul>
<li>Herramientas de empaquetado, control de versiones, rastreador de errores, documentaci&oacute;n...</li>
<li>Publicidad, y m&aacute;s potenciales usuarios, al integrarse en un sistema que pueden usar para otras cosas</li>
<li>python es un lenguaje muy claro, y tienes cython si necesitas eficiencia</li>
</ul>
<p>Por ejemplo, <strong>sage-combinat</strong> (antes mupad-combinat):</p>

{{{id=315|
P = Partitions(8)
print P.random_element()
print P.cardinality()
print P.list()
///
}}}

{{{id=351|
#Subconjuntos de [0,1,..,7] de dos elementos
Subsets(range(8),2).list()
///
}}}

{{{id=352|
#Todas las formas de sumar 10 euros con "billetes" de 2, 3 y 5
WeightedIntegerVectors(10, [2,3,5]).list()
///
}}}

{{{id=284|

///
}}}

<h3>Modificar Sage</h3>
<p>Si Sage no es exactamente lo que necesitas, siempre puedes adaptarlo a tus necesidades: <a href="http://femhub.org/" target="_blank"><strong>FEMhub</strong></a> usa python y el notebook de Sage para compartir y comparar c&oacute;digo de elementos finitos.</p>
<p><a href="http://femhub.org/" target="_blank"><img src="FEMhub_banner.png" alt="" /></a></p>
<p>&nbsp;</p>
<p><img src="FEMhub_Screenshot2.png" alt="" /></p>

{{{id=316|

///
}}}

<h3>Ejemplos...</h3>
<p><em>Haz de c&oacute;nicas</em>. Calculamos el haz de c&oacute;nicas que pasa por 4 puntos y lo animamos.</p>

{{{id=317|
puntos = [(0,0),(0,1),(1,3),(2,1)]
K = len(puntos)

var('x y')
coefs = matrix(QQ, K, 6)
for j in range(K):
    x0, y0 = puntos[j]
    coefs[j,:] = vector([x0^2, y0^2, x0*y0, x0, y0, 1])
    
K = coefs.right_kernel()
v1 = K.basis()[0]
v2 = K.basis()[1]
show(K.basis())

graficas = []
for t in srange(0,2*pi,0.3):
    c1, c2 = sin(t), cos(t)
    a,b,c,d,e,f = c1*v1 + c2*v2
    curva = a*x^2 + b*y^2 + c*x*y + d*x + e*y + f
    graficas.append( point2d(puntos,color=(1,0,0),pointsize=30) + 
                     implicit_plot(curva,(x,-1,4),(y,-1,4)) )
a = animate(graficas)
///
}}}

{{{id=295|
a.show(delay=10)
///
}}}

{{{id=386|

///
}}}

{{{id=385|

///
}}}

<p><em>Teorema de la aplicaci&oacute;n conforme de Riemann. </em>Recientemente se ha inclu&iacute;do en Sage c&oacute;digo para calcular de forma num&eacute;rica la aplicaci&oacute;n conforme desde un dominio del plano al disco unidad.</p>

{{{id=322|
ps = polygon_spline([(-1, -1), (1, -1), (1, 1), (-1, 1)])
f = lambda t: ps.value(t) 
fprime = lambda t: ps.derivative(t) 
m = Riemann_Map([f], [fprime], 0.25, ncorners=4)  
m.plot_colored() + m.plot_spiderweb()
///
}}}

{{{id=359|

///
}}}

<p><em>Singular value decomposition</em>. Comprime una imagen sustituyendo la matriz que representa la imagen por la mejor aproximaci&oacute;n de rango k.</p>

{{{id=355|
import pylab
A_image = pylab.mean(pylab.imread(DATA + 'fractal_donana.jpg'), 2)
@interact
def svd_image(i = ("Eigenvalues (quality)",(20,(1..100))),
display_axes = ("Display Axes", True)):
    u,s,v = pylab.linalg.svd(A_image)
    A = sum(s[j]*pylab.outer(u[0:,j], v[j,0:]) for j in range(i))
    g = graphics_array([matrix_plot(A),matrix_plot(A_image)])
    show(g, axes=display_axes, figsize=(10,4))
    html('<h2>Image compressed using %s eigenvalues</h2>'%i)
///
}}}

{{{id=356|

///
}}}

<p><em>Yoda</em>. Lee un archivo matlab con una figura 3D, y muestra la figura en un marco interactivo.</p>

{{{id=358|
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)
///
}}}

{{{id=378|

///
}}}

<p><em>Cambios de coordenadas</em>. Un ejemplo de interact que puede dar mucho juego en una clase de C&aacute;lculo Vectorial, sin necesidad de hablar del c&oacute;digo.</p>

{{{id=382|
#ejemplo de Jason Grout modificado
#http://wiki.sagemath.org/interact/calculus#CoordinateTransformations

var('u v')
from sage.ext.fast_eval import fast_float
from functools import partial
@interact
def trans(x=input_box(u^2-v^2, label="x=",type=SR), \
         y=input_box(u*v, label="y=",type=SR), \
         u_percent=slider(0,1,0.05,label="<font color='red'>u</font>", default=.7),
         v_percent=slider(0,1,0.05,label="<font color='blue'>v</font>", default=.7),
         u_interval = range_slider(-5, 5, default=(0,2), label="u lines"),
         v_interval = range_slider(-5, 5, default=(0,2), label="v lines"),
         ticks = ("ticks",(10,(2..20)))
         ):
     u_min, u_max = u_interval
     u_range = srange(u_min, u_max + (u_max - u_min)/ticks, (u_max - u_min)/ticks)
     v_min, v_max = v_interval
     v_range = srange(v_min, v_max + (v_max - v_min)/ticks, (v_max - v_min)/ticks)
     thickness=4
     u_val = min(u_range)+(max(u_range)-min(u_range))*u_percent
     v_val = min(v_range)+(max(v_range)-min(v_range))*v_percent
#     t_min = -t_val
#     t_max = t_val
     g1=sum([parametric_plot((i,v), (v,v_min,v_max), rgbcolor=(1,0,0)) for i in u_range])
     g2=sum([parametric_plot((u,i), (u,u_min,u_max), rgbcolor=(0,0,1)) for i in v_range])
     vline_straight=parametric_plot((u,v_val), u_min,u_max, rgbcolor=(0,0,1), linestyle='-',thickness=thickness)
     uline_straight=parametric_plot((u_val, v), v_min,v_max,rgbcolor=(1,0,0), linestyle='-',thickness=thickness)
 
     (g1+g2+vline_straight+uline_straight).save("uv_coord.png",aspect_ratio=1, figsize=[5,5], axes_labels=['$u$','$v$'])
     xuv = fast_float(x,'u','v')
     yuv = fast_float(y,'u','v')
     xvu = fast_float(x,'v','u')
     yvu = fast_float(y,'v','u')
     g3=sum([parametric_plot((partial(xuv,i),partial(yuv,i)), (v_min,v_max), rgbcolor=(1,0,0)) for i in u_range])
     g4=sum([parametric_plot((partial(xvu,i),partial(yvu,i)), (u_min,u_max), rgbcolor=(0,0,1)) for i in v_range])
     vline=parametric_plot((partial(xvu,v_val),partial(yvu,v_val)), (u_min,u_max), rgbcolor=(0,0,1), linestyle='-',thickness=thickness)
     uline=parametric_plot((partial(xuv,u_val),partial(yuv,u_val)), (v_min,v_max),rgbcolor=(1,0,0), linestyle='-',thickness=thickness)
     (g3+g4+vline+uline).save("xy_coord.png", aspect_ratio=1, figsize=[5,5], axes_labels=['$x$','$y$'])
     print jsmath("x=%s, \: y=%s"%(latex(x), latex(y)))
     print "<html><table><tr><td><img src='cell://uv_coord.png'/></td><td><img src='cell://xy_coord.png'/></td></tr></table></html>"
///
}}}

{{{id=390|

///
}}}

<h2>Cr&eacute;ditos</h2>
<p>En esta charla he usado material de:</p>
<ul>
<li><a href="http://modular.math.washington.edu/talks/20090622-sagedays16-thematic/" target="_blank">Sage Days 16 talk -- Sage: Unifying Mathematical Software</a></li>
<li><a href="http://wiki.sagemath.org/interact" target="_blank">Ejemplos usando interact</a></li>
<li><a href="http://sagebook.gforge.inria.fr/" target="_blank">Libro sobre Sage en Franc&eacute;s</a></li>
<li><a href="http://lab.femhub.org/pub/" target="_blank">Servidor  p&uacute;blico de FEMhub</a></li>
<li><a href="http://en.wikipedia.org" target="_blank">Wikipedia</a></li>
<li><a href="http://www.armoniafractal.com/" target="_blank">Armon&iacute;a fractal</a></li>
</ul>

{{{id=285|

///
}}}