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

Viết chương trình cài đặt thuật toán kiểm tra số nguyên tố với input

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 (149.78 KB, 12 trang )

Đề tài thực tập cơ sở
LỜI MỞ ĐẦU
Ngày nay, công nghệ thông tin ngày càng phát triển và tỏ rõ tầm quan trọng
trong tất cả các lĩnh vực, có thể nói cơng nghệ thơng tin đã trở thành thước đo để đánh
giá sự phát triển của xã hội hiện đại – nơi mà con người đang dần thoát khỏi cách làm
việc thủ công, thô sơ và dần tiến đến tin học hóa trong tất cả các lĩnh vực để cơng việc
có hiệu quả hơn, tiết kiệm thời gian và nhân lực.
Sinh viên CNTT ngày nay phải không ngừng học hỏi , cập nhật những công
nghệ mới nhất và biết vận dụng kiến thức đã học hỏi được vào thực tiễn cuộc sống .
Đợt thực tập cơ sở này chính là cơ hội để những sinh viên như em có thể áp dụng
những cái đã học trong những năm qua. Trong đề tài thực tập này em sẽ trình bày một
số ứng dụng và những lợi ích của cơng nghệ thơng tin mang lại trong cuộc sống .
Nhân dịp này em xin gửi lời cảm ơn đến khoa công nghệ thông tin đã tạo cơ hội
giúp em được tham gia học hỏi, rèn luyện các kỹ năng cần thiết cho đợt thực tập cuối
khóa. Đặc biệt em xin gửi lời cảm ơn đến giảng viên TS.Trần Văn Cảnh đã quan tâm
góp ý cho bài làm thực tập cơ sở và sẵn sàng trả lời những thắc mắc khi cần thiết giúp
em hồn thành tốt bài làm của mình.
Mặc dù đã có nhiều cố gắng nhưng do kiến thức còn hạn chế cùng với kinh
nghiệm chưa có nên khơng tránh khỏi thiếu sót.Vì vậy em rất mong nhận được những
ý kiến đóng góp bổ sung của thầy cơ giáo và các bạn để bài làm thực tập cơ sở của em
được hoàn thiện hơn.

MỤC LỤC

1


Đề tài thực tập cơ sở
LỜI MỞ ĐẦU..............................................................................................................1
PHẦN I: MÃ ĐỀ_NỘI DUNG BÀI TOÁN................................................................3
PHẦN II: GIẢI QUYẾT BÀI TOÁN.........................................................................3


A. CÂU 1 :....................................................................................................................3
I. NỘI DUNG BÀI TOÁN.

3

II. THUẬT TOÁN GIẢI QUYẾT CƠNG VIỆC CHO MỠI HÀM. 3
1. Lựa chọn ngơn ngữ lập trình.
2. Xác định bài toán.
3. Thuật toán.

3

3

4

4. Chương trình minh họa.

4

III. DỮ LIỆU TEST VÀ KẾT QUẢ TEST TƯƠNG ỨNG. 6
B. CÂU 2:.....................................................................................................................7
I. NỘI DUNG BÀI TOÁN.

7

II. THUẬT TOÁN GIẢI QUYẾT CÔNG VIỆC.
1. Lý Thuyết.

7


7

2. Ứng dụng của bài toán tô màu đồ thị.

7

3. Cài đặt thuật toán để giải giải quyết ứng dụng thực tế trên.

8

III. DỮ LIỆU TEST VÀ KẾT QUẢ TEST TƯƠNG ỨNG. 11
KẾT LUẬN................................................................................................................12
TÀI LIỆU THAM KHẢO...........................................................................................12

PHẦN I: MÃ ĐỀ_NỘI DUNG BÀI TOÁN
Mã đề tài : 083

2


Đề tài thực tập cơ sở

Câu 1:
Tạo một tệp văn bản dòng đầu chứa 2 số nguyên n và m, tiếp theo là một ma
trận các số thực n x m. Viết chương trình đọc các phần tử của tệp trên vào một mảng
hai chiều anxm. Xây dựng mảng một chiều b gồm các giá trị lớn nhất trên từng hàng của
mảng hai chiều a.
Câu 2:
Viết chương trình cài đặt thuật toán kiểm tra số nguyên tố với Input là đầu vào

một số bé hơn 2000000000.
Áp dụng thuật toán Rabin-Miller , Lehmann… để tăng tốc độ xử lý, không sử dụng
phương pháp vét cạn để kiểm tra.
-------------------------------------------------------PHẦN II: GIẢI QUYẾT BÀI TOÁN
A. CÂU 1 :
I. NỘI DUNG BÀI TOÁN.
Tạo một tệp văn bản dòng đầu chứa 2 số nguyên n và m, tiếp theo là một ma
trận các số thực n x m. Viết chương trình đọc các phần tử của tệp trên vào một mảng
hai chiều anxm. Xây dựng mảng một chiều b gồm các giá trị lớn nhất trên từng hàng của
mảng hai chiều a.
II. THUẬT TOÁN GIẢI QÚT CƠNG VIỆC CHO MỠI HÀM.
1. Lựa chọn ngơn ngữ lập trình.
- Ngơn ngữ lập trình Java
2. Xác định bài toán.
-Xác định đầu vào đầu ra của bài toán:
+Input:
-Tệp văn bản matran.txt tệp đầu vào dòng đầu tiên chứa 2 số nguyên m và n.
-Tiếp theo là ma trận các số thực n x m.
+Output:
- Mảng một chiều b gồm các giá trị lớn nhất trên từng hàng của mảng hai chiều
a.

3


Đề tài thực tập cơ sở
3. Thuật toán.
Bước 1:
Khai báo một mảng 2 chiều a có kích thước n x m để lưu giá trị của ma trận ,
một mảng 1 chiều b để lưu giá trị lớn nhất trên từng hàng của mảng 2 chiều a .

Bước 2:
Đọc dữ liệu từ tệp matran.txt chứa ma trận các số thực đưa vào mảng 2 chiều a
Bước 3:
-Hàm xem ma trận :
+ ta sẽ duyệt từng phần tử trên mảng 2 chiều a rồi đưa ra màn hình kết
quả

Bước 4:
-hàm tìm kiếm các phần tử có giá trị lớn nhất và đẩy vào mảng 1 chiều b
Bước 5:
- Duyệt qua các phân tử của mảng 1 chiều b và đưa ra màn hình kết quả
Bước 6 :
-Hàm main chính:
4. Chương trình minh họa
package thuctap;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Matran {
public int hang;
public int cot;
Double[][] matran;
Double[] max;
public void doctep(String fname) throws FileNotFoundException {
File f = new File(fname);

4


Đề tài thực tập cơ sở

Scanner sc = new Scanner(f);
String s[] = sc.nextLine().split("\t");
this.hang = (int) Double.parseDouble(s[0]);
this.cot = (int) Double.parseDouble(s[1]);
this.matran = new Double[hang][cot];
System.out.println("so hang la " + hang);
System.out.println("so cot la " + cot);
for (int i = 0; i < hang; i++) {
for (int j = 0; j < cot; j++) {
matran[i][j] = sc.nextDouble();
}
}
}
public void xem() {
for (int i = 0; i < hang; i++) {
for (int j = 0; j < cot; j++) {
System.out.print(matran[i][j] + "\t");
}
System.out.println();
}
}
public void maxhang() {
this.max = new Double[this.hang];
for (int i = 0; i < hang; i++) {
double max = matran[i][0];
for (int j = 1; j < cot; j++) {
if (matran[i][j] > max)
max = matran[i][j];
this.max[i] = max;
}

}
}
public void xemmax() {
System.out.println("mang max cac hang ");
for (int i = 0; i < hang; i++) {
System.out.print(max[i] + "\t");
}
}
public static void main(String[] args) throws FileNotFoundException {

5


Đề tài thực tập cơ sở
Matran a = new Matran();
a.doctep("data/matran.txt");
a.xem();
a.maxhang();
a.xemmax();
}
}

III. DỮ LIỆU TEST VÀ KẾT QUẢ TEST TƯƠNG ỨNG.
Để chạy chương trình ta sử dụng một số phần mềm chuyên dụng như : Eclip
hay Netbean …. Và bộ dữ liệu đi kèm: ta tạo 1 tệp matran.txt mỗi dòng chứa các số
nguyên cách nhau một dấu tab
-Với tệp matran.txt:

-kết quả sau khi chạy chương trình


6


Đề tài thực tập cơ sở

B. CÂU 2:
I. NỘI DUNG BÀI TOÁN.
Viết chương trình cài đặt thuật tốn kiểm tra số nguyên tố với Input là đầu vào một số
bé hơn 2000000000.
Áp dụng thuật toán Rabin-Miller , Lehmann… để tăng tốc độ xử lý, không sử dụng
phương pháp vét cạn để kiểm tra.
II. THUẬT TOÁN GIẢI QUYẾT CÔNG VIỆC.
1. Giới Thiệu.
1.1. Ứng dụng của số nguyên tố trong tin học
1.1.1. Ứng dụng
- Bài toán kiểm tra số nguyên tố là bài toán cơ bản nhưng lại hết sức quan trọng đặc
biệt là trong lĩnh vực an toàn và bảo mật thông tin cụ thể là trong hệ bảo mật RSA.
1.1.2. Các phương pháp kiểm tra số nguyên tố.
-Có rất nhiều phương pháp kiểm tra số nguyên tố như : phương pháp chứng minh theo
định lý Fecma, phương pháp sàng số nguyên tố Eratosthenes, phương pháp kiểm tra
theo xác suất . Thuật toán Miller- Rabin là thuật toán dựa trên phương pháp chứng
minh
theo xác suất và có thể thao tác trên số lớn
2. Cơ sở thuật toán
Thuật toán này dựa trên định lý quan trọng sau .
“Nếu n là số nguyên tố thì (n-1 )!≡ (n-1) mod n .Với mỗi số nguyên n, Ф(n) là số các
số nguyên tố cùng nhau với n mà nhỏ hơn n. Khi đó, với

7



Đề tài thực tập cơ sở
mọi x, x > 0, xФ(n)≡ 1 mod n ”.
3. Thuật toán.
3.1. Sơ đồ thuật toán .

Begin

+n: số cần kiểm tra
+t :số lần kiểm tra
n-1=2^k*m;
a=random();
b=a^m mod n
i=0

b=mod n ;
i=i+1

i
b1mod n

b-1mod n

n:số ngtố

End

3.2. thuật toán
o Input: là số nguyên n >3 , và một tham số để thực hiện số lần kiểm tra n

o Output:trả lời n có phải là số ngun tố hay khơng
o Thuật tốn :
Bước 1: tính n-1=2^k*m trong đó
n là số cần kiểm tra .
m là là số nguyên lẻ
s=n-1 là số nguyên
Bước 2: chọn số ngẫu nhiên a với 1< a < n-1.

8


Đề tài thực tập cơ sở
Bước 3 : tính b a^m mod n.
If(b 1 mod n)
Return “là số nguyên tố”;
else
for(int i=0;iif(b -1 mod n) Return “là số nguyên tố”;
return “không phải số nguyên tố ”.

3.4.Cài đặt chương trình .
package thuctap;
import java.util.Scanner;
import java.util.Random;
import java.math.BigInteger;
/* Class MillerRabin */
public class MillerRabin
{
/* hàm kiểm tra số nguyên tố */
public boolean kiemtra(long n, int k)

{
if (n == 0 || n == 1)
return false;
if (n == 2)
return true;
if (n % 2 == 0)
return false;
/*gán n-1=2^k.m*/
long s = n - 1;
while (s % 2 == 0)
s /= 2;
Random rand = new Random();
for (int i = 0; i < k; i++)
{
long r = Math.abs(rand.nextLong());
System.out.println(r);
long a = r % (n - 1) + 1,
m = s;
/* kiểm tra b=1 mod n hay không */

9


Đề tài thực tập cơ sở
long mod = modPow(a,m, n);
while (m != n - 1 && mod != 1 && mod != n - 1)
{
/*kiem tra xem b=-1 mod n hay khong*/
mod = mulMod(mod, mod, n);
m *= 2;

}
if (mod != n - 1 && m % 2 == 0)
return false;
}
return true;
}
/*hàm tính biểu thức (a ^ b) % c */
public long modPow(long a, long b, long c)
{
long res = 1;
for (int i = 0; i < b; i++)
{
res *= a;
res %= c;
}
return res % c;
}
/*hàm tính biểu thức (a * b) % c */
public long mulMod(long a, long b, long mod)
{
return
BigInteger.valueOf(a).multiply(BigInteger.valueOf(b)).mod(BigInteger.valueOf(mod)).
longValue();
}
/** Main function **/
public static void main (String[] args)
{
Scanner scan = new Scanner(System.in);
MillerRabin songuyento = new MillerRabin();
System.out.println("nhap so can kiem tra \n");

long so = scan.nextLong();
System.out.println("\n nhap so lan kiem tra ");
int k = scan.nextInt();
boolean prime = songuyento.kiemtra(so, k);
if (prime)
System.out.println("\n"+ so +" day la so nguyen to ");
else
System.out.println("\n"+ so +" khong la so nguyen to ");
}

10


Đề tài thực tập cơ sở

III. DỮ LIỆU TEST VÀ KẾT QUẢ TEST TƯƠNG ỨNG.
Để chạy chương trình ta sử dụng một số phần mềm chuyên dụng như : Eclip
hay NetBean …..

11


Đề tài thực tập cơ sở

KẾT LUẬN
Công nghệ thông tin là cơng cụ đắc lực, là lĩnh vực có nhiều ứng dụng phục vụ
cho nhiều ngành khác nhau trong đời sống xã hội. Qua quá trình làm đề tài chúng em
đã có dịp củng cố, bổ sung kiến thức và thu được những kinh nghiệm quý báu phục vụ
cho việc học tập và làm việc sau này. Như là các kiến thức về tìm kiếm thơng tin trên
mạng Internet, tìm hiểu được nhiều từ khoá nâng cao trong các trang tìm kiếm thơng

dụng hiện nay, nâng cao khả năng làm việc theo nhóm, nâng cao kiến thức về ngơn
ngữ lập trình C, cấu trúc dữ liệu và giải thuật và cách tổ chức giải quyết yêu cầu của
một bài toán cụ thể....
Tuy nhiên do hạn chế về trình độ, thời gian không nhiều nên những kết quả đạt
được vẫn chưa đầy đủ và có thể có nhiều sai sót. Rất mong được sự đóng góp ý kiến
của các Thầy giáo, Cơ giáo và các bạn để đề tài của nhóm chúng em được hoàn thiện
hơn.
Cuối cùng chúng em xin chân thành cảm ơn TS.Trần Văn Cảnh đã giúp đỡ
nhiệt tình cho chúng em hoàn thành đề tài này!

TÀI LIỆU THAM KHẢO
[1] Google.com
[2] Slide bài giảng “Java basic”, Giảng viên Trần Văn Cảnh, Đại học Vinh

12



×