Lewati ke konten utama

Bagian 21.7 Sage

Dalam Sage, dan juga di tempat lain, suatu perluasan dari bilangan rasional disebut “lapangan bilangan.” Lapangan bilangan merupakan salah satu fitur Sage yang paling matang.

Subbagian 21.7.1 Lapangan Bilangan

Ada beberapa cara untuk membuat lapangan bilangan. Kita telah mengenal sintaks untuk menggandengkan suatu bilangan irasional yang dapat kita tulis menggunakan kombinasi biasa dari operasi aritmetika dan akar.
Kode Sage (cadangan statis)
M.<a> = QQ[sqrt(2)+sqrt(3)]; M
Keluaran referensi (cadangan statis)
Number Field in a with defining polynomial x^4 - 10*x^2 + 1
with a = 3.146264369941973?
Kita juga dapat menetapkan elemen yang ingin digandengkan sebagai akar suatu polinomial monik tak tereduksi. Salah satu caranya ialah terlebih dahulu membangun gelanggang polinomial agar tempat koefisien polinomial tersebut ditentukan dengan tepat.
Kode Sage (cadangan statis)
F.<y> = QQ[]
p = y^3 - 1/4*y^2 - 1/16*y + 1/4
p.is_irreducible()
Keluaran referensi (cadangan statis)
True
Kode Sage (cadangan statis)
N.<b> = NumberField(p, 'b'); N
Keluaran referensi (cadangan statis)
Number Field in b with
defining polynomial y^3 - 1/4*y^2 - 1/16*y + 1/4
Alih-alih membangun seluruh gelanggang polinomial, kita cukup memperkenalkan sebuah variabel sebagai pembangkit gelanggang polinomial, lalu membuat polinomial dari variabel tersebut. Dengan demikian, kita tidak perlu menamai gelanggang polinomial itu. Perhatikan pada contoh bahwa kedua kemunculan z diperlukan.
Kode Sage (cadangan statis)
z = polygen(QQ, 'z')
q = z^3 - 1/4*z^2 - 1/16*z + 1/4
q.parent()
Keluaran referensi (cadangan statis)
Univariate Polynomial Ring in z over Rational Field
Kode Sage (cadangan statis)
P.<c> = NumberField(q, 'c'); P
Keluaran referensi (cadangan statis)
Number Field in c with
defining polynomial z^3 - 1/4*z^2 - 1/16*z + 1/4
Kita dapat memperoleh kembali polinomial yang digunakan untuk membuat suatu lapangan bilangan, bahkan jika lapangan itu kita bangun dengan memberikan ekspresi bagi suatu elemen irasional. Dalam hal ini, polinomial tersebut adalah polinomial minimal dari elemen itu.
Kode Sage (cadangan statis)
M.polynomial()
Keluaran referensi (cadangan statis)
x^4 - 10*x^2 + 1
Kode Sage (cadangan statis)
N.polynomial()
Keluaran referensi (cadangan statis)
y^3 - 1/4*y^2 - 1/16*y + 1/4
Untuk setiap elemen suatu lapangan bilangan, Sage akan menghitung polinomial minimalnya.
Kode Sage (cadangan statis)
element = -b^2 + 1/3*b + 4
element.parent()
Keluaran referensi (cadangan statis)
Number Field in b with
defining polynomial y^3 - 1/4*y^2 - 1/16*y + 1/4
Kode Sage (cadangan statis)
r = element.minpoly('t'); r
Keluaran referensi (cadangan statis)
t^3 - 571/48*t^2 + 108389/2304*t - 13345/216
Kode Sage (cadangan statis)
r.parent()
Keluaran referensi (cadangan statis)
Univariate Polynomial Ring in t over Rational Field
Kode Sage (cadangan statis)
r.subs(t=element)
Keluaran referensi (cadangan statis)
0
Menyubstitusikan kembali element ke dalam polinomial yang diduga minimal dan memperoleh nol belum merupakan bukti yang meyakinkan bahwa polinomial itu benar-benar minimal, tetapi hasil tersebut cukup menggembirakan.

Subbagian 21.7.2 Lapangan Bilangan Relatif dan Absolut

Dengan Sage, kita dapat menggandengkan beberapa elemen sekaligus dan membangun menara lapangan bilangan yang tersarang. Sage menggunakan istilah “absolut” untuk menyebut lapangan bilangan yang dipandang sebagai perluasan dari bilangan rasional itu sendiri, dan istilah “relatif” untuk menyebut lapangan bilangan yang dibangun, atau dipandang, sebagai perluasan dari lapangan bilangan lain yang tidak trivial.
Kode Sage (cadangan statis)
A.<a,b> = QQ[sqrt(2), sqrt(3)]
A
Keluaran referensi (cadangan statis)
Number Field in sqrt2 with defining polynomial x^2 - 2 over
its base field
Kode Sage (cadangan statis)
B = A.base_field(); B
Keluaran referensi (cadangan statis)
Number Field in sqrt3 with defining polynomial x^2 - 3
Kode Sage (cadangan statis)
A.is_relative()
Keluaran referensi (cadangan statis)
True
Kode Sage (cadangan statis)
B.is_relative()
Keluaran referensi (cadangan statis)
False
Secara matematis, lapangan bilangan A telah dibangun sebagai sesuatu yang kita tulis sebagai \({\mathbb Q}\subset{\mathbb Q}[\sqrt{3}]\subset{\mathbb Q}[\sqrt{3},\sqrt{2}]\text{.}\) Perhatikan sedikit perbedaan dalam urutan elemen-elemen yang kita gandengkan, dan perhatikan bahwa lapangan-lapangan bilangan memakai nama internal yang sedikit lebih khusus (sqrt2, sqrt3) untuk elemen-elemen baru tersebut.
Kita dapat “meratakan” suatu lapangan relatif agar dipandang sebagai lapangan absolut, yang mungkin memang menjadi tujuan kita sejak awal. Di sini kita membuat lapangan bilangan baru dari A sehingga diperoleh lapangan bilangan yang sepenuhnya absolut.
Kode Sage (cadangan statis)
C.<c> = A.absolute_field()
C
Keluaran referensi (cadangan statis)
Number Field in c with defining polynomial x^4 - 10*x^2 + 1
Setelah kita membangun lapangan bilangan absolut dengan cara ini, kita dapat memperoleh kembali isomorfisma menuju dan dari lapangan absolut tersebut. Ingat bahwa menara kita dibangun dengan pembangkit a dan b, sedangkan menara yang telah diratakan dibangun oleh c. Metode .structure() mengembalikan sepasang fungsi, dengan lapangan bilangan absolut masing-masing sebagai domain dan kodomain (dalam urutan tersebut).
Kode Sage (cadangan statis)
fromC, toC = C.structure()
fromC(c)
Keluaran referensi (cadangan statis)
sqrt2 - sqrt3
Kode Sage (cadangan statis)
toC(a)
Keluaran referensi (cadangan statis)
1/2*c^3 - 9/2*c
Kode Sage (cadangan statis)
toC(b)
Keluaran referensi (cadangan statis)
1/2*c^3 - 11/2*c
Hal ini memberi tahu kita bahwa satu-satunya pembangkit menara yang telah diratakan, yaitu c, sama dengan \(\sqrt{2}-\sqrt{3}\text{,}\) dan lebih lanjut, baik \(\sqrt{2}\) maupun \(\sqrt{3}\) dapat dinyatakan sebagai fungsi polinomial dari c. Berdasarkan hubungan-hubungan ini, Anda mungkin ingin menghitung dua ekspresi terakhir dalam c secara manual, lalu menghargai pekerjaan yang dilakukan Sage untuk menentukannya bagi kita. Perhitungan ini merupakan contoh dari kesimpulan Teorema 23.1.13 yang akan dibahas nanti.
Banyak metode lapangan bilangan memiliki versi relatif maupun absolut, dan kadang-kadang lebih mudah bagi kita untuk bekerja dalam bentuk menara, sedangkan pada saat lain dalam bentuk yang telah diratakan; karena itu, isomorfisma antara keduanya dapat sangat berharga untuk menerjemahkan pertanyaan maupun jawaban.
Sebagai ruang vektor atas \({\mathbb Q}\text{,}\) atau atas lapangan bilangan lain, lapangan bilangan yang merupakan perluasan hingga memiliki suatu dimensi, yang disebut derajat. Nilai-nilai ini mudah diperoleh dari Sage, meskipun untuk lapangan relatif, kita harus menyatakan dengan lebih tepat derajat mana yang kita inginkan.
Kode Sage (cadangan statis)
B.degree()
Keluaran referensi (cadangan statis)
2
Kode Sage (cadangan statis)
A.absolute_degree()
Keluaran referensi (cadangan statis)
4
Kode Sage (cadangan statis)
A.relative_degree()
Keluaran referensi (cadangan statis)
2

Subbagian 21.7.3 Lapangan Pemisah

Berikut adalah contoh konkret penggunaan Sage untuk membangun lapangan pemisah suatu polinomial. Tinjau \(p(x)=x^4+x^2-1\text{.}\) Pertama-tama, kita membangun lapangan bilangan yang memuat satu akar, lalu memfaktorkan polinomial tersebut atas lapangan baru yang lebih besar ini.
Kode Sage (cadangan statis)
x = polygen(QQ, 'x')
p = x^4 + x^2 - 1
p.parent()
Keluaran referensi (cadangan statis)
Univariate Polynomial Ring in x over Rational Field
Kode Sage (cadangan statis)
p.is_irreducible()
Keluaran referensi (cadangan statis)
True
Kode Sage (cadangan statis)
M.<a> = NumberField(p, 'a')
y = polygen(M, 'y')
p = p.subs(x = y)
p
Keluaran referensi (cadangan statis)
y^4 + y^2 - 1
Kode Sage (cadangan statis)
p.parent()
Keluaran referensi (cadangan statis)
Univariate Polynomial Ring in y over Number Field in a with
defining polynomial x^4 + x^2 - 1
Kode Sage (cadangan statis)
p.factor()
Keluaran referensi (cadangan statis)
(y - a) * (y + a) * (y^2 + a^2 + 1)
Kode Sage (cadangan statis)
a^2 + 1 in QQ
Keluaran referensi (cadangan statis)
False
Jadi, polinomial kita terfaktorkan sebagian menjadi dua faktor linear dan satu faktor kuadrat. Namun, perhatikan bahwa faktor kuadrat tersebut memiliki koefisien irasional, \(a^2+1\text{,}\) sehingga faktor kuadrat itu berada di gelanggang polinomial atas M, bukan atas QQ.
Kita membangun suatu perluasan yang memuat akar dari faktor kuadrat tersebut, yang di sini dinamai q. Kemudian, alih-alih menggunakan fungsi polygen(), kita membangun seluruh gelanggang polinomial R atas N dengan peubah tak tentu z. Hal ini dilakukan agar kita dapat memperlihatkan cara “meningkatkan” polinomial p dengan sintaks R(p), dari polinomial berkoefisien dalam M menjadi polinomial berkoefisien dalam N.
Kode Sage (cadangan statis)
q = y^2 + a^2 + 1
N.<b> = NumberField(q, 'b')
R.<z> = N[]
s = R(p)
s
Keluaran referensi (cadangan statis)
z^4 + z^2 - 1
Kode Sage (cadangan statis)
s.parent()
Keluaran referensi (cadangan statis)
Univariate Polynomial Ring in z over Number Field in b with
defining polynomial y^2 + a^2 + 1 over its base field
Kode Sage (cadangan statis)
s.factor()
Keluaran referensi (cadangan statis)
(z + b) * (z + a) * (z - a) * (z - b)
Kode Sage (cadangan statis)
a in N, b in N
Keluaran referensi (cadangan statis)
(True, True)
Dengan demikian, kita memiliki lapangan N, tempat polinomial kita terfaktorkan menjadi faktor-faktor linear dengan koefisien dari lapangan tersebut. Kita dapat memperoleh faktorisasi lain dengan mengubah N menjadi lapangan bilangan absolut lalu melakukan faktorisasi di sana. Kita perlu membuat ulang polinomial tersebut atas N, karena substitusi akan membawa koefisien dari gelanggang yang keliru.
Kode Sage (cadangan statis)
P.<c> = N.absolute_field()
w = polygen(P, 'w')
p = w^4 + w^2- 1
p.factor()
Keluaran referensi (cadangan statis)
(w - 7/18966*c^7 + 110/9483*c^5 +  923/9483*c^3 +  3001/6322*c) *
(w - 7/37932*c^7 +  55/9483*c^5 + 923/18966*c^3 - 3321/12644*c) *
(w + 7/37932*c^7 -  55/9483*c^5 - 923/18966*c^3 + 3321/12644*c) *
(w + 7/18966*c^7 - 110/9483*c^5 -  923/9483*c^3 -  3001/6322*c)
Ini merupakan alternatif yang menarik, karena akar-akar polinomial dinyatakan dalam satu-satunya pembangkit c. Karena akar-akar tersebut melibatkan pangkat tujuh dari c, kita mungkin menduga (tetapi belum dapat memastikan) bahwa polinomial minimal dari c berderajat \(8\) dan bahwa P merupakan perluasan berderajat \(8\) dari bilangan rasional. Memang, P (atau N) merupakan lapangan pemisah bagi \(p(x)=x^4+x^2-1\text{.}\) Akar-akarnya sebenarnya tidak serumit kelihatannya — mari kita ubah kembali ke lapangan bilangan relatif.
Pertama-tama, kita ingin menulis ulang satu faktor (faktor pertama) dalam bentuk \((w-r)\) agar dapat mengidentifikasi akar dengan tanda yang benar.
Dengan isomorfisma konversi, kita dapat mengenali bentuk sebenarnya dari akar-akar tersebut.
Kode Sage (cadangan statis)
fromP, toP = P.structure()
fromP(7/18966*c^7 - 110/9483*c^5 - 923/9483*c^3 - 3001/6322*c)
Keluaran referensi (cadangan statis)
-b
Jadi, ekspresi yang cukup rumit dalam c itu hanyalah negatif dari akar yang kita gandengkan pada langkah kedua pembangunan menara lapangan bilangan. Akan menjadi latihan yang baik untuk melihat apa yang terjadi pada ketiga akar lainnya (dengan berhati-hati menentukan tanda yang benar pada setiap akar).
Ini merupakan kesempatan yang baik untuk mengilustrasikan Teorema 21.1.17.
Kode Sage (cadangan statis)
M.degree()
Keluaran referensi (cadangan statis)
4
Kode Sage (cadangan statis)
N.relative_degree()
Keluaran referensi (cadangan statis)
2
Kode Sage (cadangan statis)
P.degree()
Keluaran referensi (cadangan statis)
8
Kode Sage (cadangan statis)
M.degree()*N.relative_degree() == P.degree()
Keluaran referensi (cadangan statis)
True

Subbagian 21.7.4 Bilangan Aljabar

Korolari 21.1.24 menyatakan bahwa himpunan semua bilangan aljabar membentuk suatu lapangan. Lapangan ini diimplementasikan dalam Sage sebagai QQbar. Dengan demikian, akar-akar polinomial dapat dicari sebagai besaran eksak yang ditampilkan sebagai bilangan tak eksak.
Kode Sage (cadangan statis)
x = polygen(QQ, 'x')
p = x^4 + x^2 - 1
r = p.roots(ring=QQbar); r
Keluaran referensi (cadangan statis)
[(-0.7861513777574233?,  1), (0.7861513777574233?,  1),
 (-1.272019649514069?*I, 1), (1.272019649514069?*I, 1)]
Jadi, kita meminta akar-akar suatu polinomial atas bilangan rasional, tetapi mengizinkan akar yang mungkin berada di luar bilangan rasional dan di dalam lapangan bilangan aljabar. Karena lapangan bilangan aljabar memuat semua akar tersebut, kita memperoleh keempat akar polinomial berderajat empat itu. Akar-akar ini dihitung berada dalam suatu interval, dan tanda tanya menunjukkan bahwa digit-digit sebelumnya akurat. (Bilangan bulat yang dipasangkan dengan setiap akar adalah multiplisitas akar tersebut. Gunakan kata kunci multiplicities=False untuk menonaktifkannya.) Mari kita melihat cara kerja internal Sage dalam mengelola lapangan bilangan aljabar.
Kode Sage (cadangan statis)
r1 = r[0][0]; r1
Keluaran referensi (cadangan statis)
-0.7861513777574233?
Kode Sage (cadangan statis)
r1.as_number_field_element()
Keluaran referensi (cadangan statis)
(Number Field in a with defining polynomial y^4 - y^2 - 1,
 a^3 - a,
 Ring morphism:
   From: Number Field in a with defining polynomial y^4 - y^2 - 1
   To:   Algebraic Real Field
   Defn: a |--> -1.272019649514069?)
Tiga objek dikaitkan dengan akar awal ini. Yang pertama adalah suatu lapangan bilangan, dengan pembangkit a dan polinomial pendefinisi yang serupa dengan polinomial yang sedang kita cari akar-akarnya, tetapi tidak identik. Yang kedua adalah suatu ekspresi dalam pembangkit a, yang merupakan akar sebenarnya. Anda dapat mengevaluasi ekspresi ini menggunakan hampiran numerik dari a, yang muncul sesudah ini, untuk memverifikasi bahwa ekspresi tersebut memang suatu akar. Terakhir, terdapat homomorfisma gelanggang dari lapangan bilangan ke “Lapangan Riil Aljabar”, yaitu AA, sublapangan dari QQbar yang hanya memuat elemen riil, yang mengaitkan pembangkit a dengan bilangan -1.272019649514069?. Mari kita verifikasi dengan dua cara bahwa akar yang diberikan benar-benar merupakan akar.
Kode Sage (cadangan statis)
r1^4 + r1^2 - 1
Keluaran referensi (cadangan statis)
0
Kode Sage (cadangan statis)
N, rexact, homomorphism = r1.as_number_field_element()
(rexact)^4 + rexact^2 - 1
Keluaran referensi (cadangan statis)
0
Setelah memiliki cukup teori untuk memahami lapangan bilangan aljabar, serta cara alami untuk merepresentasikan bilangan-bilangan tersebut secara eksak, Anda dapat memikirkan operasi-operasi di dalam lapangan itu. Jika kita mengambil dua bilangan aljabar dan menjumlahkannya, kita memperoleh bilangan aljabar lain (Korolari 21.1.24). Lalu, apa polinomial minimal yang dihasilkan? Bagaimana Sage menghitungnya? Anda dapat membaca kode sumbernya jika ingin mengetahui jawabannya.

Subbagian 21.7.5 Konstruksi Geometris

Sage dapat melakukan banyak hal, tetapi belum mampu menggambar garis menggunakan penggaris lurus dan jangka. Namun, kita dapat dengan sangat cepat menentukan bahwa membagi tiga sudut \(60\) derajat merupakan hal yang mustahil. Kita menggandengkan kosinus sudut \(20\) derajat (dalam radian) pada bilangan rasional, menentukan derajat perluasannya, lalu memeriksa bahwa derajat tersebut bukan merupakan pangkat bulat dari \(2\text{.}\) Semuanya dalam satu baris. Mantap.
Kode Sage (cadangan statis)
log(QQ[cos(pi/9)].degree(), 2) in ZZ
Keluaran referensi (cadangan statis)
False