Tải bản đầy đủ (.doc) (58 trang)

Đại số đa thức và các phương án cài đặt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (289.19 KB, 58 trang )

Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
LỜI MỞ ĐẦU
Đại số đa thức là một lĩnh vực quan trọng của đại số. Nó là công cụ
để nghiên cứu các phương trình đại số trong toán học và nhiều lý thuyết
của Toán học hiện đại. Chúng ta đã tiếp xúc với các phép toán về đa
thức ngay từ học trung học phổ thông. Với học sinh phổ thông việc thực
hiện các phép toán đa thức là rất cần thiết mặc dầu mất khá nhiều thời
gian.
Ngày nay tin học đã thâm nhập vào tất cả mọi hoạt động của xã hội
loài người và máy tính điện tử trở thành công cụ đắc lực không chỉ
giảm nhẹ lao động (kể cả lao động có trí tuệ) mà còn giúp thêm cho con
người những năng lực mới mà trước đây chúng ta khó hình dung được.
Việc xây dựng một chương trình có thể thực hiện được các phép tính đa
thức nhằm hiểu sâu hơn các vấn đề về cài đặt dữ liệu và các giải thuật
thích hợp với các dữ liệu ấy. Nó sẽ là một công việc có ích cho bản thân
đồng thời có thể giúp các học sinh trung học tự kiểm tra các kết quả tính
toán khi làm toán với các đa thức.
Với ý nghĩa đó đề tài đã tiến hành nghiên cứu các vấn đề về đại số đa
thức và các phương án cài đặt đa thức. Nội dung của đề tài được trình
bày trong năm chương, ngoài phần mở đầu, kết luận và tài liệu tham
khảo. Kết quả chính thu được của đề tài:
Chương 1: Đa thức và phép tính đa thức
Trong chương này trình bày đa thức như là một tổng đại số
của các đơn thức một biến và các phép toán cơ bản trên tập hợp các
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 1 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
đa thức một biến (cộng, trừ, nhân, chia, giá trị của đa thức tại một


điểm và khái niệm về ước chung lớn nhất của hai đa thức).
Chương 2: Cài đặt đa thức bằng mảng
Dựa vào định nghĩa cũng như các phép toán về đa thức đưa
ra được cách lưu trữ đa thức trong mảng là mảng một chiều gồm -1
-> n phần tử (n là một số cố định cho trước), trong đó phần tử đầu
tiên lưu giá trị bậc của đa thức. Từ đó cài đặt các phép toán: cộng,
trừ, nhân, tính giá trị của đa thức và tìm ước chung lớn nhất của hai
đa thức trên mảng. Tuy nhiên với cách lưu trữ này cũng có một số
thuận lợi và khó khăn khi cài đặt chương trình.
Chương 3: Cài đặt đa thức bẳng mảng con trỏ
Đa thức được lưu trữ bởi một bản ghi gồm hai trường, một
trường để lưu bậc của đa thức trường còn lại là mảng con trỏ. Trong
quá trình cài đặt các phép tóan, khi cần thiết để lưu các hệ số của đa
thức tương ứng với lũy thừa ta mới cấp phát biến động tương ứng với
chỉ số của mảng con trỏ.
Dựa trên lưu trữ đa thức bằng mảng con trỏ để thực hiện các
phép toán đối với đa thức, cài đặt thuật toán cũng giống như đối với
mảng.
Chương 4: Cài đặt đa thức bảng danh sách liên kết
Các phương pháp lưu trữ đã trình bày ở trên dễ dàng cài đặt
nhưng rất tốn bộ nhớ. Để khắc phục bằng cách lưu trữ đa thức dưới
dạng là một danh sách liên kết bao gồm các nút được liên kết với nhau.
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 2 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Mỗi nút là gồm ba trường: hệ số, lũy thừa và một con trỏ để lưu địa chỉ
của nút tiếp theo trong danh sách, ngoài ra còn có một nút để chứa bậc
của đa thức, nút này là nút đầu trong danh sách.

Lưu trữ bằng danh sách liên kết phức tạp hơn đối với mảng và
mảng con trỏ, vì vậy việc thực hiện cài đặt các phép toán khó khăn hơn.
Bằng cách lưu trữ này cũng đã thực hiện thành công việc cài đặt các
phép toán cộng, trừ, nhân, chia, tính giá trị và tìm ước chung lớn nhất
của hai đa thức.
Chương 5: Thiết kế đồ họa
Để giao diện thân thiện hơn với người sử dụng, đề tài còn
nghiên cứu về kỹ thuật đồ họa trong Pascal trong việc tạo menu,
dùng tiếng việt trong Pascal và có sử dụng ngắt 33h và các hàm của
BIOS để điều khiển chuột.
Đề tài được hoàn thành dưới sự hướng dẫn của thầy giáo Tiến
sỹ Nguyễn Trung Hòa. Nhân dịp này em xin được bày tỏ lòng biết ơn
sâu sắc tới thầy giáo hướng dẫn vì sự giúp đỡ và chỉ dẫn hết sức nhiệt
tình, chu đáo.
Em xin gửi lời cảm ơn tới Nhà trường, khoa Công nghệ Thông
tin đã tạo điều kiện cho chúng em được học tập và rèn luyện trong suốt
bốn năm học vừa qua.
Em xin tỏ lòng biết ơn sâu sắc tới các thầy giáo, cô giáo, bạn
bè trong khoa đã giúp đỡ trong quá trình học tập và nghiên cứu.
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 3 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Đề tài không tránh khỏi nhiều thiếu sót. Em kính mong nhận
được sự chỉ bảo của các thầy giáo, cô giáo và sự góp ý của các bạn
trong khoa.

Sinh viên
Trần Thị Lê Na

CHƯƠNG 1: ĐA THỨC VÀ CÁC PHÉP TOÁN ĐA THỨC
1. Định nghĩa đa thức
Biểu thức hình thức:
(1) f(x) = a
n
x
n
+ a
n-1
x
n-1
+ ... + a
1
x + a
0

- Trong đó a
n
, a
n-
1
, ..., a
1
, a
0

Є K (K là một trường tuỳ ý) với a
n
≠ 0,
được gọi là đa thức bậc n. Ta viết degf = n có nghĩa là bậc của f bằng n.


- Các phần tử a
n
, a
n-1
, ..., a
1
, a
0

Є K được gọi là các hệ tử, x là ẩn
- a
i
x
i
, i =
n,0
là các hạng tử của đa thức f(x)
- a
n
x
n
là hạng tử cao nhất của đa thức f(x).
-

a
0
là hạng tử tự do của đa thức f(X).
- Đa thức f(x) = a
n

x
n
, a ≠ 0 còn được gọi là đơn thức bậc n.
- Trong trường hợp a
0
≠ 0, n = 0 thì f(x) có bậc bằng 0.
- Đa thức f(x) được gọi là đa thức không nếu và chỉ nếu tất cả các
hệ số của nó bằng 0.
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 4 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
- Nhấn mạnh ở đây rằng ta luôn đồng nhất biểu thức (1) với các biểu
thức dẫn dắt từ (1), tức là tổng theo thứ tự tuỳ ý các đơn thức tham gia
trong (1). Như vậy biểu thức viết theo thứ tự ngược lại với (1).
(2) a
0
+ a
1
x + ... + a
n-1
x
n-1
+ a
n
x
n

cùng là một đa thức g(x) đồng nhất với f(x).

- Khi K là một trường số thực hoặc phức thay cho thuật ngữ hệ tử và
hạng tử ta sẽ dùng thuật ngữ hệ số và số hạng.
2. Định nghĩa các phép toán trên đa thức
2.1) Phép cộng hai đa thức
Cho f(x) = a
n
x
n
+ a
n-1
x
n-1
+ ... + a
1
x

+ a
0

và g(x) = b
n
x
n
+ b
n-1
x
n-1
+ ... + b
1
x + b

0
,
là các đa thức với hệ số trong K.
Khi đó đa thức:
f(x) + g(x) = (a
n
+ b
n
) x
n
+ (a
n-1
+ b
n-1
) x
n-1
+ ... + (a
1
+ b
1
)x + (a
0
+ b
0
)
được gọi là tổng của hai đa thức f(x) và g(x).
Ở đây nếu bậc của hai đa thức không bằng nhau ta viết thêm các số
hạng với hệ số bằng không.
2.2) Trừ hai đa thức
Phép trừ hai đa thức cũng tương tự như phép cộng hai đa thức:

Cho f(x) = a
n
x
n
+ a
n-1
x
n-1
+ ... + a
1
x

+ a
0

và g(x) = b
n
x
n
+ b
n-1
x
n-1
+ ... + b
1
x + b
0
,
là các đa thức với hệ số trong K.
Khi đó đa thức:

Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 5 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
f(x) - g(x) = (a
n
- b
n
) x
n
+ (a
n-1
- b
n-1
) x
n-1
+ ... + (a
1
- b
1
)x + (a
0
- b
0
)
được gọi là hiệu của hai đa thức f(x) và g(x).
Ở đây nếu bậc của hai đa thức không bằng nhau ta viết thêm các số
hạng với hệ số bằng không.
2.3) Phép nhân hai đa thức

Cho hai đa thức:
f(x) = a
n
x
n
+ a
n-1
x
n-1
+ ... + a
1
x + a
0
, a
n
≠ 0
g(x) = b
m
x
m
+ b
m-1
x
m-1
+ ... + b
1
x + b
0
, b
m

≠ 0
thì
f(x)g(x) = d
n+m
x
n+m
+ d
n+m-1
x
n+m-1
+ ... + d
1
x+ d
0
trong đó
d
i
=

=+
ijk
a
k
b
j
, i = 0, 1, ..., n +m.
Hiển nhiên
degf(X)g(X) = degf(X) + degg(X)
f(X)g(X) = g(X)f(X)
và f(X)(r(X) + s(X)) = f(X)r(X) + f(X)s(X)

2.4) Phép chia hai đa thức
Giả sử f, g Є K[x] và g ≠ 0 khi đó f có thể viết duy nhất dưới dạng:
(1) f = gq + r
Với q, r Є K[x] và degr < degq
Biểu thức (1) được gọi là phép chia có dư đa thức f(x) cho đa thức
g(x) ≠ 0. Đa thức f(x) được gọi là đa thức bị chia, đa thức g(x) là đa
thức chia, đa thức q(x) là thương còn đa thức r(x) là phần dư của phép
chia.
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 6 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Nếu r(x) = 0 ta nói f(x) chia hết cho g(x), khi đó ta cũng nói g(x) là
một ước của f(x).
2.5) Tính giá trị của đa thức.
Cho đa thức f(x) = a
n
x
n
+ a
n-1
x
n-1
+ ... + a
0
.
Với các hệ số của đa thức a
0
, a

1
, ... , a
n-1
, a
n
và x cho trước.
Để tính giá trị của đa thức ta dùng thuật toán Horner
P = (... ((a
n
x + a
n-1
)x + a
n-2
)x + ... + a
1
)x + a
0
, trong đó quá trình truy
hồi được tiến hành như sau:
P
n
= a
n
P
n-1
= P
n
x + a
n-1
...

P = P
0
= P
1
x + a
0

<=> P := Px + a
k
Với k =
1,1

n
2.6) Ước chung lớn nhất của hai đa thức.
Nhắc lại rằng g Є K[x], g ≠ 0 được gọi là ước chung của f Є K[x] nếu
f chia hết cho g và ta viết f | g.
Cho f, g, h Є K[x]. Ta nói
+ h là ước chung của f và g nếu h | f và h | g.
+ h là ước chung lớn nhất (UCLN) của f và g, nếu nó là ước chung của f
và g và chia hết cho mọi ước chung khác.
Áp dụng thuật chia ECLIDE ta có thể tìm ước chung lớn nhất của hai
đa thức f và g không đồng thời bằng không.
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 7 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Thật vậy ta coi g ≠ 0. Chia f cho g ta được phần dư r
1
. Nếu r

1
≠ 0, ta
chia g cho r
1
, được phần dư r
2
. Cứ tiếp tục vì bậc của các phần dư giảm
dần nên tồn tại k ≥ 1 sao cho r
k-1
| r
k
. Ta sẽ kiêm lại khi đó rằng.
r
k
= (f, g)
Thật vậy xuất phát từ đẳng thức r
k-1
= r
k
h
k+1

Suy ra r
k
| r
k-2
và cũng vậy r
k
|r
k-3

. Cứ như vậy ta nhận được
r
k
|g và r
k
|f
Bây giờ nếu φ là một ước chung tuỳ ý của f và g thì φ | r
1

cũng vậy φ | r
2
. Cứ như thế ta lại nhận được φ | r
k
CHƯƠNG 2: CÀI ĐẶT ĐA THỨC BẰNG MẢNG
1. Lý do cài đặt bằng mảng
Cấu trúc mảng là cấu trúc rất quen thuộc ở mọi ngôn ngữ lập
trình. Đặc biệt trong ngôn ngữ lập trình Pascal. Nếu như chúng ta
biết cách khai thác và sử dụng sẽ giúp chúng ta giải quyết được
nhiều bài toán.
1.1) Ưu điểm:
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 8 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
- Dùng mảng có lợi điểm là có thể đọc ngược, đọc xuôi một
cách dễ dàng và truy xuất đến một phần tử mảng cũng hết sức nhanh
chóng.
- Mảng được lưu trữ kế tiếp nên việc truy nhập vào phần tử
của mảng được thực hiện trực tiếp dựa vào địa chỉ tính được, nên tốc

độ nhanh và đồng đều đối với mọi phần tử.
2.2) Nhược điểm:
Mặc dầu có rất nhiều ứng dụng ở đó mảng có thể được sử
dụng để thể hiện mối quan hệ về cấu trúc giữa các phần tử dữ liệu.
Tuy nhiên cũng lộ rõ một số nhược điểm như:
- Không có phép bổ sung phần tử hoặc loại bỏ phần tử được
thực hiện đối với mảng.
- Không tận dụng được các vùng nhớ có kích thước nhớ nhỏ
vì các thành phần của mảng cần được lưu trữ một cách kế tiếp.
- Khi dùng mảng đều phải khai báo trước kích thước của
mảng. Trong khi đó chúng ta lại không thể dự đoán trước kích
thước của dữ liệu vì thế thường xảy ra tình trạng: khai báo kích
thước gây lãng phí bộ nhớ hoặc ngược lại khai báo thiếu thì máy bị
treo không chạy nổi chương trình.
Ví dụ cộng (3x^2 – x + 3)
Với (2x^2 + x - 3)
Để có kết quả là (5x^2)
Có thể dùng mảng một chiều để biểu diễn: hệ số của số hạng
x
i
sẽ được lưu trữ ở phần tử thứ i của mảng một chiều, ta quy ước
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 9 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
bậc của đa thức được lưu trữ ở phần tử -1. Như vậy phép cộng hai
đa thức chính là phép cộng hai mảng. Cách biểu diễn đã đưa tới
phép xử lý đơn giản. Tuy nhiên ta cũng thấy một số nhược điểm:
Đa thức: 3x^2 – x + 3 được lưu trữ

Chỉ số mảng -1 0 1 2
2 3 -1 3
Các hệ số tương ứng các lũy thừa
Đa thức: 2x^2 + x – 3 được lưu trữ
-1 0 1 2
Kết quả khi cộng hai đa thức trên:
-1 0 1 2
2 5 0 0
Ta thấy kết quả là một mảng mới biểu diễn nhiều phần
tử bằng 0, nó vẫn chiếm ô nhớ trong bộ nhớ, trong khi đó các giá trị
đó không sử dụng tới khuynh hướng này tạo ra sự lãng phí bộ nhớ
rất rõ.
2. Định nghĩa kiểu mảng.
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 10 
2 2 1 -3
Hệ số
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Kiểu mảng (Array) là một kiểu dữ liệu có cấu trúc gồm một số
cố định các phần tử có cùng một kiểu dữ liệu đặt sau tên mảng. Nói
cách khác, dữ liệu kiểu mảng là một mảng (dãy) của nhiều dữ liệu
thuộc một kiểu khác.
Kiểu mảng có những đặc trưng sau:
- Các phần tử của mảng phải cùng kiểu, kiểu đó gọi là kiểu
cơ sở hay kiểu thành phần.
- Các phần tử trong mảng có chỉ số, tức là vị trí số thứ tự của
chúng trong mảng. Kiểu của chỉ số phải là kiểu rời rạc. Mỗi phần
tử có thể được truy nhập trực tiếp thông qua chỉ số.

- Các chỉ số là các biểu thức nằm trong dấu ngoặc vuôn []
đặt ngay sau tên mảng và kiểu của chúng gọi là kiểu chỉ số.
- Kiểu chỉ số là một kiểu nguyên hoặc miền con, giá trị của
chỉ số có thể là âm hoặc dương.
3. Cách khai báo.
3.1) Khai báo gián tiếp
TYPE
<Tên kiểu mảng> = Array[<chỉ số>] of <kiểu>;
VAR
<Tên biến>:<Tên mảng>;
3.2) Khai báo trực tiếp
VAR
<Tên biến mảng> = Array[<chỉ số>] of <kiểu>;
4. Ý tưởng giải thuật
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 11 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Bài toán đặt ra phải xử lý được các phép toán trên đa thức cài đặt
bằng mảng.
Đặc trưng của đa thức là một bộ hệ số, mỗi hệ số tương ứng với số
luỹ thừa và bậc cuả đa thức.
f(x) = a
n
x
n
+ a
n-1
x

n-1
+ ... + a
0
, a
n
≠ 0
Biểu diễn bộ hệ số, và bậc của đa thức trên cùng mảng một chiều.
Các chỉ số -1 0 1 ... n-2 n-1 n
Hệ số
Các hệ số tương ứng các lũy thừa
Khai báo đa thức a:
Var
a:array[-1..maxbac] of real;
Trong đó:
maxbac là một số cố định cho trước.
a[-1] = n là bậc của đa thức.
4.1) Cộng hai đa thức
Cho hai đa thức f(x) và g(x) như sau:
f(x) = a
n
x
n
+ a
n-1
x
n-1
+ ... + a
0
, a
n

≠ 0
g(x) = b
m
x
m
+ b
m-1
x
m-1
+ ... + b
0
, b
m
≠ 0
* Phép tính cộng hai đa thức được thực hiện như sau:
Ta biểu diễn từng đa thức dưới dạng mảng một chiều, trong đó phần
tử đầu tiên của mảng chính là bậc của đa thức, các phần tử còn lại chứa
hệ số tương ứng với luỹ thừa của từng số hạng.
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 12 
n a
0
a
1
... a
n-2
a
n-1
a

n
...
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Phép cộng hai đa thức được thực hiện là phép tính cộng lần lượt các
hệ số cùng luỹ thừa lại với nhau. Ở đây nếu luỹ thừa của hai đa thức không
bằng nhau ta viết thêm các số hạng với hệ số bằng không.
Khi cộng hai đa thức với nhau ta sẽ được một đa thức mới, đa thức c
với:
c[i] = a[i] + b[i] (i: 0->max(n,m))
4.2) Trừ hai đa thức
Thực hiện phép trừ đa thức a cho đa thức b
Tương tự như phép tính cộng hai đa thức, ta chỉ thay dấu cộng
bởi dấu trừ.
4.3) Nhân hai đa thức
Cho hai đa thức f(x) và g(x) như sau:
f(x) = a
n
x
n
+ a
n-1
x
n-1
+ ... + a
0
, a
n
≠ 0
g(x) = b

m
x
m
+ b
m-1
x
m-1
+ ... + b
0
, b
m
≠ 0
+ Biểu diễn đa thức a:
Nhân hai đa thức thực hiện như sau:
For i:=0 to n+m do
Begin
c[i]:=0;
For k:=0 to i do
If (k<=n) and (i-k<m) then
c[i]:= c[i] + a[k]*b[i-k] ;
End;
4.4) Chia hai đa thức
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 13 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Cho hai đa thức f(x) và g(x) như sau:
f(x) = a
n

x
n
+ a
n-1
x
n-1
+ ... + a
0
, a
n
≠ 0
g(x) = b
m
x
m
+ b
m-1
x
m-1
+ ... + b
0
, b
m
≠ 0
Dựa vào định nghĩa phép chia hai đa thức đã trình bày ở chương 1 để
thực hiện phép chia đa thức a cho đa thức b.
4.5) Tính giá trị của đa thức
Áp dụng thuật toán Horner để tính giá trị của đa thức.
4.6) Tìm ước chung lớn nhất của hai đa thức
Áp dụng thuật chia ECLIDE

5. Cài đặt chương trình
5.1) Cộng hai đa thức.
Procedure CongDT(a,b:mang;Var c:mang);
Var i,n,m,max:shortint;
Begin
n:=round(a[-1]);m:=round(b[-1]);
If n>m then max:=n
Else max:=m;
For i:=0 to max do
c[i]:=a[i]+b[i];
i:=max;
While (c[i]=0) and (i>=0) do dec(i);
c[-1]:=i;
End;
5.2) Trừ hai đa thức.
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 14 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Procedure TruDT(a,b:mang;Var c:mang);
Var i,n,m,max:shortint;
Begin
n:=round(a[-1]);m:=round(b[-1]);
If n>m then max:=n
Else max:=m;
For i:=0 to max do
c[i]:=a[i] - b[i];
i:=max;
While (c[i]=0) and (i>=0) do dec(i);

c[-1]:=i;
End;
5.3) Nhân hai đa thức.
Procedure NhanDT(a,b:mang; Var c:mang);
Var i,k,n,m:shortint;
Begin
n:=round(a[-1]);m:=round(b[-1]);
If (n<0) or (m<0) then c[-1]:=-1
Else
Begin
For i:=0 to n+m do
Begin
c[i]:=0;
For k:=0 to i do
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 15 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
If (k<=n) and (i-k<=m) then
c[i]:=c[i]+a[k]*b[i-k];
End;
c[-1]:=n+m;
End;
End;
5.4) Chia hai đa thức
Procedure ChiaDT(a,b:mang; Var q,r:mang);
Var m,l,h,n,i:shortint;
q1,t:mang;
Begin

If a[-1]<b[-1] then r:=a
Else Begin
q[-1]:=a[-1]-b[-1];
For i:=0 to round(q[-1]) do q[i]:=0;
m:=round(b[-1]);
While a[-1]>=m do
Begin
n:=round(a[-1]);
l:=n-m;
q1[-1]:=l;
For i:=0 to l do q1[i]:=0;
q1[l]:=a[n]/b[m];
q[l]:=q1[l];
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 16 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
NhanDT(q1,b,t);
TruDT(a,t,r);
a:=r;
End;
End;
End;
5.5) Tính giá trị của đa thức
Function GiaTri(x:real; a:mang):real;
Var n,i:shortint;
t:real;
Begin
n:=round(a[-1]);

If n>=0 then
Begin
t:=a[n];
For i:=1 to n do t:=t*x+a[n-i]
End;
GiaTri:=t;
End;
5.6) Tìm ước chung lớn nhất của hai đa thức
Procedure UCLN(a,b:mang; var c:mang);
Var q,r:mang;
Begin
While b[-1]>=0 do
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 17 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Begin
ChiaDT(a,b,q,r);
a:=b;
b:=r;
End;
c:=a;
If c[-1]=0 then c[0]:=1;
End;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 18 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt

CHƯƠNG 3: CÀI ĐẶT ĐA THỨC BẰNG MẢNG ĐỘNG
1. Lý do cài đặt bằng mảng động.
Bài toán mà chúng ta đã cài đặt bằng mảng ở trên, biến mà chúng ta
dùng là biến tĩnh, là biến có kích thước, kiểu dữ liệu cố định và địa chỉ
của biến là không đổi. Các biến này tồn tại trong suốt quá trình chạy
chương trình. Đó là lý do gây lãng phí bộ nhớ.
Để khắc phục nhược điểm này ngôn ngữ lập trình pascal cho phép sử
dụng biến động. Biến động không được sinh ra lúc bắt đầu chương trình
mà sinh ra trong quá trình thực hiện chương trình. Sau khi thực hiện
xong có thể xoá khỏi bộ nhớ. Nói cách khác, mặc dù gặp khai báo biến
nhưng máy không cấp phát ô nhớ cho biến mà chỉ cấp phát khi nào biến
cần tới. Sau khi dùng xong có thể xoá để tiết kiệm bộ nhớ.
Tuy nhiên biến động cũng có một số nhược điểm là không có địa chỉ
nhất định nên không thể truy cập đến chúng được. Để khắc phục nhược
điểm nhà thiết kế phần mềm cung cấp cho chúng ta một loại biến đặc
biệt, biến này chứa địa chỉ của biến động gọi là biến con trỏ. Biến con
trỏ cho phép thao tác trên các giá trị địa chỉ. Mục đích của biến con trỏ
giúp khai thác bộ nhớ, tiết kiệm bộ nhớ, an toàn dữ liệu.
2. Cách khai báo
2.1) Kiểu con trỏ
Type
<Kiểu con trỏ> = <^Kiểu biến động>;
2.2) Biến con trỏ
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 19 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Var
<Tên biến con trỏ> : ^<Kiểu con trỏ>;

2.3) Lấy nội dung của một biến con trỏ đang trỏ đến
<Biến con trỏ>^
2.4) Tạo biến động
Dùng thủ tục New(Var ptr:Pointer)
- Tạo ra một vùng biến động có kiểu và kích thước theo quy
định.
- Hướng con trỏ đến vùng biến động này.
2.5) Xoá biến động
- Thủ tục Release(Var HeapPtr : Pointer);
Thủ tục cho phép xoá toàn bộ vùng nhớ Heap đã cấp phát tính từ
điểm đã đánh dấu.
Đặt con trỏ HeapPtr tới địa chỉ của biến động đã được đánh dấu xoá
bằng thủ tục Mark trong Heap. Khi thi hành thủ tục Release sẽ xoá tất
cả vùng nhớ nằm ở phía trên địa chỉ này. Không xoá những vùng nhớ
được các biến động sử dụng ở giữa Heap.
- Thủ tục Dispose(Var Ptr : Pointer);
Thủ tục xoá một vùng nhớ do thủ tục New cấp phát cho một biến
động.
3. Cách lưu trữ đa thức
Cách lưu trữ đa thức như sau:
Type
mang = array[0..maxbac] of ^real;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 20 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
dt = Record
m: mang;
bac: shortint;

End;
Var
a: ^dt;
Trong đó: maxbac: một số cố định cho trước.
a.bac: bậc của đa thức.
a.m[0]^ .. a.m[a.bac]^: hệ số tương ứng với luỹ thừa.
Dựa vào cách lưu trữ đó, ta cài đặt các phép toán của đa thức
hoàn toàn giống như cách cài đặt đa thức bằng mảng.
* Ví dụ minh họa thực hiện nhân hai đa thức
Cho hai đa thức:
Đa thức a: ‘7x^7 + 3x^5 + 5x + 1’
bậc 0 1 2 3 4 5 6 7 8 ... 100
7 ...

Đa thức b: ‘-7x^7 + 2x^2 + 3’
bậc 0 1 2 3 4 5 6 7 8 ... 100
7 ...

Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 21 
1 5 3
7
3 2 -7
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
 Sau khi thực hiện phép nhân hai đa thức ta sẽ được một đa thức
mới:
bậc 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 … 100
14 ...


4. Cài đặt chương trình.
4.1) Cộng hai đa thức
Procedure MCT_CongDT( a1,b1:dt;var c1:dt);
Var
i,n,m,max:shortint;
Begin
m:=a1.bac; n:=b1.bac;
If n>m then max:=n else max:=m;
For i:=0 to max do
If (a1.m[i]<>nil) then
Begin
new(c1.m[i]);
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 22 
3
15
2
10 9
-8
35 -14
21
-49
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
If b1.m[i]<>nil then
Begin
c1.m[i]^:=a1.m[i]^+b1.m[i]^;
If c1.m[i]^=0 then

Begin
dispose(c1.m[i]);
c1.m[i]:=nil;
End;
End
Else c1.m[i]^:=a1.m[i]^
End
Else if b1.m[i]<>nil then
Begin
new(c1.m[i]);
c1.m[i]^:=b1.m[i]^;
End;
i:=max;
While (c1.m[i]=nil) and (i>=0) do dec(i);
c1.bac:=i;
End;
4.2) Trừ hai đa thức
Procedure MCT_Trudt(a1,b1:dt; var c1:dt);
Var
i,n,m,max:shortint;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 23 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
Begin
m:=a1.bac; n:=b1.bac;
If n>m then max:=n else max:=m;
For i:=0 to max do
If (a1.m[i]<>nil) then

Begin
new(c1.m[i]);
If b1.m[i]<>nil then
Begin
c1.m[i]^:=a1.m[i]^-b1.m[i]^;
If c1.m[i]^=0 then
Begin
dispose(c1.m[i]);
c1.m[i]:=nil;
End;
End
Else c1.m[i]^:=a1.m[i]^
End
Else if b1.m[i]<>nil then
Begin
new(c1.m[i]);
c1.m[i]^:=-b1.m[i]^;
End;
i:=max;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 24 
Khóa luận Tốt nghiệp Đại số đa thức và các phương án
cài đặt
While (c1.m[i]=nil) and (i>=0) do dec(i);
c1.bac:=i;
End;
4.3) Nhân hai đa thức
Procedure MCT_NhanDT(a1,b1:dt;var c1:dt);
Var

i,j,k,n,m,max:shortint;
t:real;
Begin
m:=a1.bac; n:=b1.bac;
If (m<0) or (n<0) then c1.bac:=-1
Else
Begin
For i:=0 to m+n do
Begin
c1.m[i]:=nil;
t:=0;
For k:=0 to i do
If (k<=m) and (i-k<=n) and (a1.m[k]<>nil) and

If t<>0 then
Begin
new(c1.m[i]);
c1.m[i]^:=t;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại
học Vinh
 25 
(b1.m[ik]<>nil) then t:=t+a1.m[k]^*b1.m[i-k]^;

×