FAQ: Uso di Sage¶
Come posso partire?¶
Puoi provare Sage senza dover scaricare nulla:
CoCalc™: Vai su https://cocalc.com e crea un account gratis.
Se accedi al sito, avrai accesso all’ultima versione di Sage e molti altri programmi
Ricorda che questo sito è un servizio commerciale indipendente da Sage.
Sage cell: Una singola versione di Sage, disponibile per fare una computazione alla volta. https://sagecell.sagemath.org/
Per scaricare una distribuzione binaria precompilata di Sage vai al link http://www.sagemath.org/download.html e clicca sul link relativo al file binario per il tuo sistema operativo.
Il codice sorgente di Sage è anche disponibile al download: vai al link http://www.sagemath.org/download-source.html per scaricare l’archivio TAR di qualunque rilascio di Sage.
Le sessioni di lavoro Notebook di Sage sono eseguite all’interno di
un browser web. Puoi lanciare il Notebook di sage attraverso il
seguente comando purché sage
sia nella variabile PATH
$ sage -notebook
Quali sono i prerequisiti di Sage?¶
La maggior parte delle dipendenze sono incluse all’interno di Sage. Nella maggior parte dei casi puoi scaricare il binario precompilato ed usarlo senza dover installare alcun pacchetto dipendente. Se usi Windows avrai bisogno di installare VirtualBox, che puoi scaricare dal link http://www.virtualbox.org/wiki/Downloads. Dopo aver installato VirtualBox devi scaricare una distribuzione di Sage per VirtualBox al link http://www.sagemath.org/download-windows.html. Segui bene le istruzioni che trovi a quella pagina. Poi puoi lanciare la macchina virtuale Sage usando il software VirtualBox.
Puoi scaricare il codice sorgente completo di Sage per compilarlo sul
tuo sistema Linux o Mac OS X. Sage si trova in una cartella isolata e
non va ad interferire col sistema in cui si trova. Viene dato con
tutto il necessario per lo sviluppo, il codice sorgente, tutte le
dipendenze ed il changelog (cioè la lista delle modifiche operate)
completo. Sui sistemi Linux come Debian/Ubuntu puoi dover installare
il pacchetto build essential
ed il processore di macro m4
. Il
tuo sistema deve disporre di un compilatore C funzionante se vuoi
compilare Sage da codice sorgente. Su Debian/Ubuntu puoi installare
questi prerequisiti come segue:
sudo apt-get install build-essential m4
Se hai un sistema multiprocessore puoi scegliere una compilazione parallela di Sage. Il comando
export MAKE='make -j8'
abiliterà 8 threads per quelle parti della compilazione che supportano il parallelismo. Al posto del numero 8 metti il numero di processori/core del tuo sistema.
Come posso far riconoscere la mia attuale installazione di Tcl/Tk all’interprete Python di Sage?¶
Potresti avere la libreria Tcl/Tk installata e l’interprete Python del tuo sistema la riconosce ma l’interprete Python di Sage no. Ad oggi (2023) solitamente non c’è bisogno di compilare l’interprete Python di Sage, ma se ne hai bisogno, segui queste istruzioni. Controlla di aver installato la libreria di sviluppp Tcl/Tk. Su Ubuntu lancia, da riga di comando:
sudo apt-get install tk8.5-dev
o qualcosa di simile. Poi reinstalla l’interprete Python di Sage con:
make python3-clean python3-uninstall && make python3
Questo aggancerà automaticamente la libreria Tcl/Tk. Dopo aver reinstallato correttamente l’interprete Python di Sage, lancia i seguenti comandi dall’interfaccia a riga di comando di Sage:
import _tkinter
import Tkinter
Se non ti viene segnalato alcun errore di ImportError
allora il problema è risolto.
Come faccio ad importare Sage in uno script Python?¶
Puoi importare Sage in uno script Python come faresti con una libreria. La cosa a cui fare attenzione è che devi lanciare quello script Python usando l’interprete Python interno a Sage (versione 3.7.x per Sage 9.2). Per importare Sage metti la seguente istruzione in cima al tuo script Python:
from sage.all import *
Quando poi esegui il tuo script devi lanciare Sage con l’opzione
-python
che farà sì che venga eseguito dalla versione
dell’interprete interna a Sage. Ad esempio, se Sage è nella tua
variabile d’ambiente PATH
, puoi scrivere:
sage -python /path/to/my/script.py
Un altro modo è scrivere uno script Sage e lanciarlo usando Sage
stesso. Uno script Sage ha estensione .sage
ed è simile ad uno
script Python ma utilizza funzioni e comandi specifici di Sage.
Puoi poi lanciare tale script Sage in questo modo:
sage /path/to/my/script.sage
Questo si occuperà di caricare le variabili d’ambiente necessarie ed eseguire gli import di default al posto tuo.
Come posso ricaricare uno script Python in una sessione di Sage?¶
Puoi caricare uno script Python in una sessione Sage usando il comando load. Ad esempio possiamo usare Sage per importare un file di nome “simple.py” con:
load("simple.py")
e ripetere questo comando ogni volta che cambiamo il file. Invece digitando:
attach("simple.py")
ogni cambiamento al file verrà automaticamente aggiornato anche in Sage.
Posso usare Sage con la versione 3.x di Python?¶
Dalla versione 9.0 del Gennaio 2020, SageMath utilizza Python 3.
Ho usato Debian/Ubuntu per installare la versione 3.0.5 di Sage ed essa sta dando un sacco di errori. Cosa posso fare?¶
La versione di Sage distribuita con apt-get
in Debian e Ubuntu
(tipo la 3.0.5) è molto vecchia. Nessuno ha ancora avuto tempo di
aggiornare la versione di Sage per Debian/Ubuntu.
Qualunque aiuto in tal senso sarà molto apprezzato.
Dovresti scaricare la versione più recente di Sage dal
link di download del sito
web di Sage. Se vuoi aiutarci ad aggiornare la versione di Sage per
Debian/Ubuntu manda un’email alla mailing list
sage-devel.
Faccio meglio ad usare la versione ufficiale o quella di sviluppo?¶
Ti consigliamo di usare la più recente versione ufficiale di Sage. Le versioni di sviluppo sono spesso annunciate sulle mailing list sage-devel e sage-release. Una maniera facile di aiutare con lo sviluppo di Sage è scaricare l’ultima versione di sviluppo, compilarla sul suo sistema, lanciare tutti i doctest e segnalare qualunque errore di compilazione o qualunque fallimento nei doctest.
È difficile imparare Sage?¶
Le funzionalità di base di Sage dovrebbero risultare facili da imparare quanto le basi di Python. Molti tutorial sono disponibili in rete per aiutarti ad imparare Sage. Per trarre il massimo da Sage ti consigliamo di imparare qualche elemento del linguaggio Python. Segue una lista, incompleta, di risorse su Python. Altre risorse possono essere trovate cercando sul web.
Building Skills in Python di Steven F. Lott
Dive into Python di Mark Pilgrim
How to Think Like a Computer Scientist di Jeffrey Elkner, Allen B. Downey, and Chris Meyers
Python home page e Python standard documentation
Posso fare X in Sage?¶
Ti consigliamo di usare l’autocompletamento di Sage con il tasto TAB.
Ti basta digitare qualche carattere, premere TAB e vedere se il
comando che vuoi compare nella lista di autocompletamento.
Se hai un comando che si chiama mycmd
,
allora digitalo e premi TAB per visualizzare la lista di funzionalità
che sono supportate da quel comando. Per leggere la documentazione di
mycmd
scrivi mycmd?
poi premi Invio e protrai leggerla.
In modo similare, digitando mycmd??
e poi Invio potrai
visualizzare il codice sorgente di tale comando.
Ti consigliamo anche di eseguire ricerche nel codice sorgente e
nella documentazione di Sage. Per eseguire ricerche nel codice
sorgente di Sage usa il comando
search_src("<search-keyword>")
mettendo al posto di <search-keyword>
le parole chiave che
vuoi cercare.
Analogamente puoi effettuare ricerche nella documentazione di
Sage usando il comando:
search_doc("<search-keyword>")
.
Cosa fa esattamente Sage quando digito “0.6**2”?¶
Quando scrivi “0.6**2” in Python, ti viene restituito qualcosa tipo 0.35999999999999999. Ma quando fai lo stesso in Sage ti viene restituito 0.360000000000000. Per capire perché Python si comporta in questo modo vedi il Python Tutorial, soprattutto il capitolo “Aritmetica floating-point: caratteristiche e limiti”. Ciò che Sage fa è preprocessare l’input e trasformarlo come segue:
sage: preparse("0.6**2")
"RealNumber('0.6')**Integer(2)"
>>> from sage.all import *
>>> preparse("0.6**2")
"RealNumber('0.6')**Integer(2)"
preparse("0.6**2")
Così che ciò che viene effettivamente eseguito è:
RealNumber('0.6')**Integer(2)
Gli sviluppatori Sage (in pratica Carl Witty) decisero che i numeri
floating-point di Sage dovessero, di default, stampare solo il numero
di cifre decimali corrette, quando possibile, così da evitare il
problema che ha Python. Questa decisione ha i suoi pro e contro.
Nota che RealNumber
e Integer
sono specifici di Sage,
quindi non puoi digitare quanto sopra nell’interprete Python ed
aspettarti che funzioni, se prima non hai eseguito delle istruzioni
di import quali:
from sage.all import RealNumber, Integer, preparse
Perché il comando “history” di Sage è diverso da quello di Magma?¶
Nell’uso di Sage non disponi di una funzionalità dell’interfaccia a riga di comando di Magma. In Magma, se immetti una linea recuperata dalla “history” (cioè dall’elenco dei comandi digitati precedentemente che viene automaticamente memorizzato) con il tasto “freccia in su’” e poi premi “freccia in giu’”, viene recuperata anche la linea successiva nell’elenco. Questa funzionalità ti permette di recuperare dalla “history” tante righe consecutive quante vuoi. Ma Sage non ha una funzionalità simile: la riga di comando IPython utilizza la libreria “readline” (via pyreadline), che evidentemente non supporta questa funzionalità. Magma ha una sua propria libreria personalizzata simile alla “readline” che invece supporta questa funzionalità. (Dal momento che moltissime persone hanno richiesto questa funzionalità, se qualcuno trovasse un modo per implementarla sarebbe il benvenuto!)
Ho problemi di tipo nell’utilizzo da Sage di SciPy, cvxopt e NumPy.¶
Stai usando da Sage le librerie SciPy, cvxopt e NumPy e hai degli errori tipo:
TypeError: function not supported for these types, and can't coerce safely to supported types.
Quando digiti numeri in Sage, il preprocessore li converte in un anello base, come puoi vedere facendo:
sage: preparse("stats.uniform(0,15).ppf([0.5,0.7])")
"stats.uniform(Integer(0),Integer(15)).ppf([RealNumber('0.5'),RealNumber('0.7')])"
>>> from sage.all import *
>>> preparse("stats.uniform(0,15).ppf([0.5,0.7])")
"stats.uniform(Integer(0),Integer(15)).ppf([RealNumber('0.5'),RealNumber('0.7')])"
preparse("stats.uniform(0,15).ppf([0.5,0.7])")
Sfortunatamente il supporto che NumPy fornisce a questi tipi avanzati di
Sage, quali Integer
o RealNumber
(numeri reali di precisione arbitraria), non è del 100%.
Per risolvere ridefinisci Integer
e/o RealNumber
per cambiare
il comportamento del preprocessore di Sage così che i decimali
scritti vengano registrati come tipi float di Python anziché RealNumber
di Sage e gli interi scritti siano registrati come tipi int di Python
anziché Integer di Sage. Ad esempio:
sage: RealNumber = float; Integer = int
sage: from scipy import stats
sage: stats.ttest_ind([1,2,3,4,5], [2,3,4,5,.6])
Ttest...Result(statistic=...0.0767529..., pvalue=...0.940704...)
sage: stats.uniform(0,15).ppf([0.5,0.7])
array([ 7.5, 10.5])
>>> from sage.all import *
>>> RealNumber = float; Integer = int
>>> from scipy import stats
>>> stats.ttest_ind([Integer(1),Integer(2),Integer(3),Integer(4),Integer(5)], [Integer(2),Integer(3),Integer(4),Integer(5),RealNumber('.6')])
Ttest...Result(statistic=...0.0767529..., pvalue=...0.940704...)
>>> stats.uniform(Integer(0),Integer(15)).ppf([RealNumber('0.5'),RealNumber('0.7')])
array([ 7.5, 10.5])
RealNumber = float; Integer = int from scipy import stats stats.ttest_ind([1,2,3,4,5], [2,3,4,5,.6]) stats.uniform(0,15).ppf([0.5,0.7])
In alternativa sii esplicito circa il tipo di dato, ad esempio:
sage: from scipy import stats
sage: stats.uniform(int(0),int(15)).ppf([float(0.5),float(0.7)])
array([ 7.5, 10.5])
>>> from sage.all import *
>>> from scipy import stats
>>> stats.uniform(int(Integer(0)),int(Integer(15))).ppf([float(RealNumber('0.5')),float(RealNumber('0.7'))])
array([ 7.5, 10.5])
from scipy import stats stats.uniform(int(0),int(15)).ppf([float(0.5),float(0.7)])
Come terza alternativa puoi usare i suffissi semplici:
sage: from scipy import stats
sage: stats.uniform(0r,15r).ppf([0.5r,0.7r])
array([ 7.5, 10.5])
>>> from sage.all import *
>>> from scipy import stats
>>> stats.uniform(0,15).ppf([0.5,0.7])
array([ 7.5, 10.5])
from scipy import stats stats.uniform(0r,15r).ppf([0.5r,0.7r])
Puoi anche disabilitare il preprocessore nel tuo codice tramite il
comando preparse(False)
. Puoi lanciare IPython da solo dalla riga
di comando con sage -ipython
, cosa che non precarica niente di
specifico di Sage. O ancora puoi cambiare il linguaggio di
sessione (Notebook language) in “Python”.
Come faccio a salvare un oggetto così che non devo ridigitarlo ogni volta che apro un foglio di lavoro (worksheet)?¶
I comandi save
e load
rispettivamente registrano e caricano un
oggetto. Nella sessione di lavoro Notebook la variabile DATA
è la
collocazione dello spazio di salvataggio del foglio di lavoro
(worksheet). Per registrare l’oggetto my_stuff
in un foglio di
lavoro puoi digitare:
save(my_stuff, DATA + "my_stuff")
e, per ricaricarlo, ti basta digitare:
my_stuff = load(DATA + "my_stuff")
Sage contiene una funzione simile alla “ToCharacterCode[]” di Mathematica?¶
Potresti voler convertire caratteri ASCII come “Big Mac” nel
corrispondente codice numerico per ulteriori elaborazioni. In Sage e
Python puoi usare ord
. Ad esempio:
sage: list(map(ord, "abcde"))
[97, 98, 99, 100, 101]
sage: list(map(ord, "Big Mac"))
[66, 105, 103, 32, 77, 97, 99]
>>> from sage.all import *
>>> list(map(ord, "abcde"))
[97, 98, 99, 100, 101]
>>> list(map(ord, "Big Mac"))
[66, 105, 103, 32, 77, 97, 99]
list(map(ord, "abcde")) list(map(ord, "Big Mac"))
Come posso scrivere le multiplicazioni in modo implicito come in Mathematica?¶
Sage ha una funzione che lo rende possibile:
sage: implicit_multiplication(True)
sage: x 2 x # not tested
2*x^2
sage: implicit_multiplication(False)
>>> from sage.all import *
>>> implicit_multiplication(True)
>>> x Integer(2) x # not tested
2*x^2
>>> implicit_multiplication(False)
implicit_multiplication(True) x 2 x # not tested implicit_multiplication(False)
Questo viene preprocessato da Sage in codice per Python. Potrebbe non funzionare in situazioni complicate. Per vedere cosa il preprocessore fa:
sage: implicit_multiplication(True)
sage: preparse("2 x")
'Integer(2)*x'
sage: implicit_multiplication(False)
sage: preparse("2 x")
'Integer(2) x'
>>> from sage.all import *
>>> implicit_multiplication(True)
>>> preparse("2 x")
'Integer(2)*x'
>>> implicit_multiplication(False)
>>> preparse("2 x")
'Integer(2) x'
implicit_multiplication(True) preparse("2 x") implicit_multiplication(False) preparse("2 x")
Vai al link https://wiki.sagemath.org/sage_mathematica per maggiori informazioni su Mathematica vs. SageMath.
Posso far eseguire in automatico a Sage dei comandi all’accensione?¶
Sì, ti basta creare un file $HOME/.sage/init.sage
ed esso sarà
eseguito ogni volta che lanci Sage. Questo presuppone che la
variabile ambiente di Sage DOT_SAGE
punti alla cartella nascosta
$HOME/.sage
, cosa che avviene di default.
Quando compilo Sage il mio computer fa beep e si spegne o si blocca.¶
Compilare sage è piuttosto faticoso per il processore del computer. Il comportamento suddetto di solito indica che il computer si è surriscaldato. In molti casi questo si può risolvere pulendo il ventilatore del processore del computer ed assicurando adeguata areazione al computer. Puoi chiedere al tuo amministratore di sistema o ad un tecnico di provvedere, qualora tu non l’abbia mai fatto. Questa manutenzione del computer, se non fatta da persone preparate, potrebbe anche danneggiare il computer.
Per gli utenti Linux, se pensi che la compilazione fallisca per un
problema di risorse di macchina, una soluzione potrebbe essere di
modificare il file /etc/inittab
per far partire Linux al
runlevel 3. Tale file di solito contiene qualcosa del tipo:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have
# networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:
Questo fa sì che la tua distribuzione Linux parta con la schermata
di login grafico. Commenta la linea id:5:initdefault:
e
aggiungi la linea id:3:initdefault:
, così da aver qualcosa come:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have
# networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
# id:5:initdefault:
id:3:initdefault:
Ora se riavvii il sistema ti troverai davanti all’interfaccia di login testuale. Questa ti permette di accedere al sistema con una sessione testuale all’interno di un terminale virtuale. Una tale sessione di solito non consuma molte risorse, come farebbe invece un’interfaccia grafica. Poi puoi compilare Sage da codice sorgente in tale sessione testuale. Dovresti assicurarti di essere in grado di riattivare successivamente l’interfaccia grafica, prima di tentare di accedere tramite un’interfaccia testuale.
Quando lancio Sage, SELinux segnala che “/path/to/libpari-gmp.so.2” richiede “text-relocation” (riallocazione del testo). Come posso risolvere?¶
Il problema può essere risolto eseguendo il seguente comando:
chcon -t textrel_shlib_t /path/to/libpari-gmp.so.2
L’aggiornamento di Sage è andato bene, ma adesso l’indicatore continua a mostrare la versione precedente. Come posso risolvere?¶
L’indicatore (banner in inglese) è memorizzato e non ricalcolato ad
ogni esecuzione di Sage. Il fatto che non sia aggiornato non dovrebbe
impedire a Sage di funzionare regolarmente. Digita banner()
in una
sessione di Sage per verificare la versione reale. Se vuoi l’indicatore
corretto allora devi ricompilare Sage digitando make build
in un
terminale.
Come posso eseguire Sage come demone/servizio?¶
Ci sono parecchie possibilità. Puoi usare i programmi a riga di comando
screen
, nohup
o disown
.
Posso usare gli strumenti di Sage in un ambiente commerciale?¶
Sì! Assolutamente! Fondamentalmente l’unico limite che hai è che se fai dei delle modifiche a Sage stesso e redistribuisci pubblicamente tale versione modificata, allora devi renderci disponibili tali modifiche cos’ che le possiamo includere nella versione standard di Sage (se vogliamo). Altrimenti sei libero di usare quante copie di Sage vuoi per fare soldi, ecc. senza pagare alcuna licenza.
Voglio scrivere del codice Cython che usa l’aritmetica dei campi finiti, ma l’istruzione “cimport sage.rings.finite_field_givaro” non funziona. Cosa posso fare?¶
Devi segnalare a Sage di usare C++ (sia Givaro che NTL sono librerie C++) e che hai bisogno anche delle librerie GMP e STDC C++. Ecco un piccolo esempio:
# These comments are hints to Cython about the compiler and
# libraries needed for the Givaro library:
#
# distutils: language = c++
# distutils: libraries = givaro gmpxx gmp m
cimport sage.rings.finite_field_givaro
# Construct a finite field of order 11.
cdef sage.rings.finite_field_givaro.FiniteField_givaro K
K = sage.rings.finite_field_givaro.FiniteField_givaro(11)
print("K is a {}".format(type(K)))
print("K cardinality = {}".format(K.cardinality()))
# Construct two values in the field:
cdef sage.rings.finite_field_givaro.FiniteField_givaroElement x
cdef sage.rings.finite_field_givaro.FiniteField_givaroElement y
x = K(3)
y = K(6)
print("x is a {}".format(type(x)))
print("x = {}".format(x))
print("y = {}".format(y))
print("x has multiplicative order = {}".format(x.multiplicative_order()))
print("y has multiplicative order = {}".format(y.multiplicative_order()))
print("x*y = {}".format(x * y))
# Show that x behaves like a finite field element:
for i in range(1, x.multiplicative_order() + 1):
print("{} {}".format(i, x**i))
assert x*(1/x) == K.one()
Per saperne di più digita quanto segue al prompt di Sage
sage.rings.finite_field_givaro.FiniteField_givaro.
Poi premi TAB, ed usa ??
per avere più informazioni su ogni
funzione. Ad esempio:
sage.rings.finite_field_givaro.FiniteField_givaro.one??
fornisce informazioni sull’unità moltiplicativa nel campo finito.
La compilazione su Mac OS X fallisce in maniera incomprensibile. Come posso risolvere?¶
Cerca il file di log della compilazione (install.log) e controlla se c’è il seguente messaggio:
fork: Resource temporarily unavailable.
Se è così, prova a fare questo: crea (o modifica se c’è già) il file
/etc/launchd.conf
includendovi quanto segue:
limit maxproc 512 2048
Poi riavvia. Vedi il seguente link per maggiori dettagli.
Come disegno la radice cubica (o altre radici dispari) di numeri negativi?¶
Questa è una delle domande chieste più frequentemente. Ci sono molti metodi descritti nelle documentazione per la funzione plot, ma questo è il più semplice:
sage: plot(real_nth_root(x, 3), (x, -1, 1))
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> plot(real_nth_root(x, Integer(3)), (x, -Integer(1), Integer(1)))
Graphics object consisting of 1 graphics primitive
plot(real_nth_root(x, 3), (x, -1, 1))
Tuttavia, nota che il metodo più diretto:
sage: plot(x^(1/3), (x, -1, 1)) # not tested
>>> from sage.all import *
>>> plot(x**(Integer(1)/Integer(3)), (x, -Integer(1), Integer(1))) # not tested
plot(x^(1/3), (x, -1, 1)) # not tested
produce il grafico corretto solo per valori di \(x\) positivi. La ragione per cui ciò avviene è che Sage restituisce dei numeri complessi per le radici dispari di numeri negativi, quando queste sono approssimate, il che è una convenzione standard:
sage: numerical_approx( (-1)^(1/3) )
0.500000000000000 + 0.866025403784439*I
>>> from sage.all import *
>>> numerical_approx( (-Integer(1))**(Integer(1)/Integer(3)) )
0.500000000000000 + 0.866025403784439*I
numerical_approx( (-1)^(1/3) )
Come va utilizzato in Sage l’operatore XOR bitwise?¶
L’OR esclusivo in Sage si fa con l’operatore ^^
. C’è anche il
corrispondente “operatore inplace” ^^=
. Ad esempio:
sage: 3^^2
1
sage: a = 2
sage: a ^^= 8
sage: a
10
>>> from sage.all import *
>>> Integer(3)^Integer(2)
1
>>> a = Integer(2)
>>> a ^= Integer(8)
>>> a
10
3^^2 a = 2 a ^^= 8 a
Se definisci 2 variabili e poi confronti:
sage: a = 5; b = 8
sage: a.__xor__(b), 13
(13, 13)
>>> from sage.all import *
>>> a = Integer(5); b = Integer(8)
>>> a.__xor__(b), Integer(13)
(13, 13)
a = 5; b = 8 a.__xor__(b), 13
Puoi anche fare:
sage: (5).__xor__(8)
13
>>> from sage.all import *
>>> (Integer(5)).__xor__(Integer(8))
13
(5).__xor__(8)
Le parentesi sono necessarie affinché Sage non supponga di avere a che fare con un numero reale. Ci sono molti modi di definire una funzione:
sage: xor = lambda x, y: x.__xor__(y)
sage: xor(3, 8)
11
>>> from sage.all import *
>>> xor = lambda x, y: x.__xor__(y)
>>> xor(Integer(3), Integer(8))
11
xor = lambda x, y: x.__xor__(y) xor(3, 8)
Un’altra possibilità, che aggira il preparser di Sage, è
sage: def xor(a, b):
....: return eval("%s^%s" % (a, b))
sage: xor(3, 8)
11
>>> from sage.all import *
>>> def xor(a, b):
... return eval("%s^%s" % (a, b))
>>> xor(Integer(3), Integer(8))
11
def xor(a, b): return eval("%s^%s" % (a, b)) xor(3, 8)
Puoi anche disattivare il preparser di Sage con il comando
preparser(False)
, a quel punto l’operatore ^
funzionerà
esattamente come in Python. Puoi successivamente riattivare il
preparser con il comando preparser(True)
. Questo funziona solo
dalla riga di comando di Sage. Se sei in una sessione Notebook, passa
in “Python mode”.
Quando provo ad usare LaTeX in una sessione Notebook, dice che non trova “fullpage.sty”.¶
La risposta più ampia, ma forse non la più utile, è che hai bisogno di
installare fullpage.sty
in una cartella acceduta da TeX. Su Ubuntu
(e probabilmente anche su altre distribuzioni Linux) dovresti
installare il pacchetto texlive-latex-extra
. Se non è disponibile,
prova ad installare il pacchetto tetex-extra
. Se stai usando
Mac OS X dovrai usare una qualunque distribuzione TeX che hai già per
ottenere fullpage.sty
(se usi MacTeX probabilmente ce l’hai già installato).
Se stai usando l’immagine VirtualBox in Windows dovrai fare login in
tale immagine ed da lì installare texlive-latex-extra
.
Con degli oggetti “a” e “b” ed una funzione “f” ho digitato accidentalmente “f(a)=b” anziche’ “f(a)==b”. Questo mi ha dato un errore “TypeError” (come mi aspettavo) ma ha anche cancellato l’oggetto “a”. Perchè?¶
Questo è dovuto a come sono definite le funzioni in Sage con la
notazione f(x)=expr
usando il preparser. Nota anche che se fai
quest’errore in un costrutto if
, avrai un errore SyntaxError
prima di qualunque altro comportamento errato, quindi, in questo caso,
non hai il problema.
Come posso usare un browser internet diverso con il notebook di Sage?¶
Dovrai farlo dalla linea di comando. Semplicemente lancia un comando come questo.
Linux (assumendo che hai Sage nella cartella
/usr/bin
):$ env BROWSER=opera /usr/bin/sage --notebook
Mac (assumendo che tu sia nella cartella dove hai scaricato Sage). Con il notebook Jupyter:
$ BROWSER='open -a Firefox %s' ./sage --notebook jupyter $ BROWSER='open -a Google\ Chrome %s' ./sage --notebook jupyter
Dov’è il codice sorgente di <function>
?¶
Le funzioni e classi scritte in Python o Cython sono di solito
accessibili tramite la linea di comando IPython con il comando ??
:
sage: plot?? # not tested
Signature: plot(*args, **kwds)
Source:
...
>>> from sage.all import *
>>> plot?? # not tested
Signature: plot(*args, **kwds)
Source:
...
plot?? # not tested
Tuttavia gli oggetti che sono costruiti in Python o IPython sono compilati e non verranno visualizzati. Ci sono molte funzioni in Sage costruite come funzioni simboliche, i.e. possono essere usate come parte di espressioni simboliche senza dover essere calcolate. Il loro codice sorgente potrebbe non essere accessibile dalla linea di comando, sopratutto per le funzioni elementari, poiché sono scritte in C++ (per ragioni di efficienza).