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

phân tích các số nguyên có dạng 2m-1 ra thừa số nguyên 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 (175.37 KB, 13 trang )

PHÂN TÍCH CÁC SỐ NGUYÊN CÓ DẠNG 2
m
-1
RA THỪA SỐ NGUYÊN TỐ
ĐẶT VẤN ĐỀ
Bài toán phân tích số nguyên ra thừa số nguyên tố đã được ra đời từ
rất lâu và đã cuốn hút nhiều bộ óc vĩ đại nhất trên thế giới để giải quyết vấn
đề về nó. Ngoài ý nghĩa lý thuyết của bản thân bài toán thì người ta còn phát
hiện ra rất nhiều ý nghĩa thực tiễn đặc biệt là trong mật mã.
Thứ nhất nó là cơ sở cho sù ra đời của một hệ mật khoá công khai nổi
tiếng ra đời trong năm 1978, đó là hệ mật RSA của Revert Shamir và
Shamir. Hệ mật này mà độ mật của nó dựa vào tính khó của việc phân tích
số N=pq (p, q nguyên tố ) ra thừa số.
Tiếp đến trong những việc thiết kế nên các bộ tạo dãy giả ngẫu nhiên
một trong những nguyên liệu của nó là các đa thức nguyên thuỷ mà để tạo
được các đa thức nguyên thuỷ bậc m thì điều đầu tiên phải giải quyết là phân
tích hoàn toàn với 2
m
-1 ra thừa số nguyên tố.
Bản đồ án không đi xâu vào các phân tích những ý nghĩa nêu trên mà
chỉ đặt nhiệm vụ chính là giải quyết bài toán: “Phân tích các số 2
m
-1 ra thừa
số nguyên tố (với m≤200)” như là một việc làm trung gian của một ứng
dụng thực tiễn cụ thể.
Để giải quyết vấn đề được đặt ra trong đồ án này, chúng tôi đưa ra
một số cơ sở lý thuyết. Chương 1 sẽ trình bầy về các số Mersenne. Các số có
dạng M
q
=2
q


-1 (với q là nguyên tố ) được gọi là các số Mersenne và đã được
nghiên cứu công phu. Chương 2 xem xét loại bài toán quen thuộc hơn, đó là
bài toán phân tích số nguyên ra thừa số nguyên tố. Chương 3 là phần cơ bản
của đề án, trong đó trình bày các tư tưởng của thuật toán phân tích ra thừa số
nguyên tố của những số nguyên lớn. Tiếp theo trong chương này trình bày
cách cài đặt cụ thể cho những thuật toán liên quan đến việc phân tích ra thừa
số nguyên tố, ví dụ như các phép : +, -, *, / và luỹ thừa các số lớn. Chúng tôi
1
còn đặc biệt lưu ý tới việc cài đặt thuật toán Pollard thứ nhất, một thuật toán
rất hiêụ quả trong việc phân tích những hợp số lớn.
2
CHƯƠNG I. CÁC SỐ MERSENNE VÀ VIỆC PHÂN TÍCH
1.1 Sè Mersenne
Định nghĩa Các số có dạng M
q
=2
q
-1 (với q là nguyên tố ) được gọi là các
số Mersenne.
Bài toán: Nếu q là một số nguyên tố đồng dư modulo 4(q≡3(mod 4)) thì M
q
chia hết cho 2q+1 khi và chỉ khi 2q+1 là nguyên tố; trong trường hợp này,
nếu q>3 thì M
q
là hợp số.
Tính chất: "Nếu M
q
chia hết cho n thì n
≡±
1 (mod 8) và n


1 (mod q)"
1.2 Phép thử nguyên tố cho các số Mersenne
M
n
=2
n
-1 là nguyên tố khi và chỉ khi M
n
là ước của S
n-2
.
trong đó, dẫy (S
k
)
k>=1
được định nghĩa như sau:
S
0
=4; S
k+1
=S
k
2
-2
Cũng như đối với các số Fermat, hiện còn có rất nhiều vấn đề mở về
các số Mersenne:
(1) Liệu có vô hạn các số nguyên tố Mersenne không?
(2) Liệu có vô hạn các số Mersenne là hợp số không?
Câu trả lời cho cả hai câu hỏi trên chắc là “có”

(3) Có phải mọi số Mersenne đều là không chính phương không?
3
CHƯƠNG II. MỘT SỐ PHƯƠNG PHÁP PHÂN TÍCH SỐ
2.1 Thuật toán sàng Eratosthenes
Cho N là một số nguyên, thuật toán sàng Eratosthenes để phân tích N ra các
thừa số nguyên tố được mô tả như sau:
(1) p=1.
(2) p=p+1.
(3) Tính r=N mod p.
Nếu r>0 quay về (2).
Ngược lại p là ước của N. Dừng chương trình
Đây là thuật toán có tính phổ thông và mặc dù như chúng ta đã biết là
thuật toán rất “tồi” vì thời gian tính của nó là O(
N
) nhưng nếu N có ước
nhỏ thì việc áp dụng thuật toán này lại rất hiệu quả. Hơn thế nữa, thuật toán
này cũng có thể lấy điểm xuất phát của bước (1) là p=[
N
] và tiến hành
bước (2) là p=p-1 thì rõ ràng nó cũng hiệu quả nếu ước của N rất “gần” với
N
.
2.2 Phương pháp p-1: Thuật toán Pollard thứ nhất
Thuật toán kiểu p-1 là thuật toán phân tích số nguyên N dựa vào phân
tích của p-1 với p là một ước nguyên tố của N. Thuật toán còn được gọi là
thuật toán phân tích thứ nhất của Pollard, đây là một thuật toán có tác dụng
nếu ta biết được các ước nguyên tố của một thừa số p của N nói chung và
đặc biệt nếu N có một thừa số nguyên tố p mà p-1 chỉ gồm những ước
nguyên tố nhỏ thì thuật toán được trình bày trong phần này sẽ có hiệu quả.
Ý tưởng của thuật toán là tìm một cách ngẫu nhiên số a∈Z

*
n
có bậc
không là ước của p-1. Sè a nếu tìm được hiển nhiên phải thoả mãn b≡a
p-1
mod N ≠1, điều này có ý nghĩa N không là ước của b-1. Mặt khác, do p
nguyên tố nên theo định lý Fermat ta có b mod p≡(a
p-1
mod N) mod p=1 như
vậy b-1 ≡ 0 mod p và do đó ta có ngay p | gcd(b-1,N). Hai điều kéo theo
p=gcd(b-1,N).
4
Một số vấn đề chưa tường minh trong việc thực hiện nói trên là:
Do p là số chưa biết nên dấu hiệu nhận biết giá trị a cần tìm là a
p-1
mod N#1
cũng chưa xác định. Tất nhiên ở đây điều kiện nhận biết có thể được làm
“nhẹ” bớt đó là ta có thể thay sè p-1 chưa biết bằng số Q giả định có thể là
chọn trước và tính b≡a
Q
mod N, nếu N>gcd(b-1, N)>0 thì việc chọn của
chúng ta đã thành công và có p=gcd(b-1, N). Hiển nhiên việc giả định Q chỉ
có nghĩa khi và chỉ khi p-1 là ước của Q, trong trường hợp p-1 chỉ có các
ước nguyên tố nhỏ tức là p-1=
qq
N
k
q
N
q

k
loglog
1

1
. Tất nhiên các số mũ trong khai
triển của Q là quá dư thừa do đó các lựa chọn tiếp theo của chúng ta sẽ là cố
giảm các số mũ này đến mức thấp nhất có thể, cách làm cụ thể cho việc này
sẽ được mô tả cụ thể trong thuật toán.
Các bước của thuật toán Pollard (dùng để phân tích N có ước p với p-
1 chỉ gồm các ước nguyên tố trong k số nguyên tố đầu tiên).
Thuật toán p-1 của Pollard
(1) Q=
qq
N
k
q
N
q
k
loglog
1

1
, i=1,j=0.
(2) Lấy a ngẫu nhiên trong Z
*
N
, tính b


a
Q
mod N.
(3) Xét đẳng thức b=1.
- Nếu đúng chuyển sang (4).
- Ngược lại chuyển sang (6).
(4) Xét j<log
qi
N.
- Nếu đúng thì j=i+1, Q=Q|q
i
, quay về (3).
- Ngược lại: chuyển sang (5).
(5) Xét i<k.
- Nếu đúng thì : i=i+1, j=0, nÕu b#1 thì Q=Q.q
i
. Quay về (4).
- Ngược lại quay về (1).
(6) Xét gcd (b-1, N)>1.
- Nếu đúng có ước của n là gcd (b-1,N). Dừng chương trình.
- Ngược lại quay về (4)
5
2.3 Phương pháp ρ : Thuật toán Pollard thứ hai
Bước tiến đáng kể nhất trong các thuật toán hiệu quả trong việc tìm
các ước nhỏ là thuật toán dựa vào phương pháp còn được gọi là ρ, thuật toán
Pollard thứ hai. Thời gian tính của thuật toán này chỉ còn là O (
p
) với p là
ước nguyên tố nhỏ nhất của N. Như vậy trong trường hợp tồi nhất (p≈
N

)
thì thời gian tính cũng chỉ là
3
N
.
Trước hết, chúng ta xét đến thuật toán sau:
Thuật toán sàng đồng dư
(1) Lấy ngẫu nhiên hai sè a và b ngẫu nhiên

Z
*
N
.
(2) Kiểm tra gcd((a-b) mod N, N) hoặc gcd((a+b) mod N, N)>1 là xác suất
như sau:
- Nếu đúng thì gcd((a-b) mod N, N) hoặc gcd((a+b) mod N, N)>1 là
ước của N. Dừng chương trình.
- Ngược lại quay về (1).
Hiển nhiên bằng cách duyệt dần thì thời gian tính của thuật toán của
chúng ta cũng chẳng khác gì thời gian tính của phép sàng. Trong [Pollard],
tác giả J. M. Pollard đã sử dụng một phương pháp còn được gọi là “phương
pháp p” nhằm chỉ cần thông qua
m
bước có thể duyệt được m cặp khác
nhau như đã nêu trong thuật toán. Việc thể hiện phương pháp này có thể mô
tả như sau:
Chọn dãy giả ngẫu nhiên {x
i
mod N:i=1,2, } được xác định như sau
x

i-1

(x
i
2
+a) mod N với a#0 và #-2 còn giá trị đầu x
0
tuỳ ý.
Thuật toán Pollard thứ hai
(1) i=0
(2) i=i+1
(3) Xét gcd((x
2i
- x
i
)mod N,N)>1
- Nếu đúng ta có gcd((x
2i
- x
i
)mod N,N). Dừng chương trình.
- Ngược lại quay về (2).
6
CHƯƠNG III. XÂY DỰNG PHẦN MỀM PHÂN TÍCH CÁC SỐ 2
n
-1
3.1 Sơ đồ xuất phát
Q
0
ngưỡng phân tích


Nhận xét: nếu N có các ước p mà p-1 phân tích hoàn toàn trong Q thì gcd(a-
1, N)>1 với a=a
Q!
mod N
(≈∀ ước p của N, đều có ước nguyên tố lớn của p-1 thì Q rất lớn, và ta có
thể lấy Q≈
N
)
Thoả hiệp, khống chế số bước tìm Q<Q
0
- Chỉ sau ≤Q
0
bước là thuật toán dừng
- Trong trường hợp mọi ước nguyên tố p của N ta đều có p-1 có ước >
Q
0
thì không tìm được ước của N. Khi này ta nói N không phân tích
được bằng thuật toán Pollard với ngưỡng Q
0
.
7
T
Begin
NhËp N
(hîp sè)
Q=2
a=Random(N)
d=gcd(a-1,
N)>1

a≡a
Q
mod N
d lµ %íc cña
N
Kh«ng ph©n
tÝch ®%îc
F
Q<Q
0
Q=Q+1
F
T
3.2 Phân tích hệ thống
Căn cứ vào sơ đồ xuất phát cần phải có các quy tắc để biểu diễn các số lớn
trên máy tính, các cách thực hiện các phép toán số học +, -, *, / , và luỹ thừa
trên các số lớn này.
3.2.1. Khai báo số lớn
Biểu diễn q phần một số nguyên N
Định nghĩa: Cho q>0 khi đó ∀N ∃ duy nhất bộ n
0
, n
1
, ,n
k
, với 0≤n
i
<q, sao
cho
N=n

0
+n
1
q+n
2
q
2
+ +n
k
q
k
(1)
(1) được gọi là biểu diễn q phân của số N.
Nhận xét: Như vậy, muốn biểu diễn N ta chỉ cần biết bộ (n
0
, n
1
, ,n
k
). Nếu q
là một số nhỏ thì việc tìm ra các n
i
tương đối dễ dàng; ở đây chúng ta chọn
q=2
16
=65536.
3.2.2 Phép cộng số lớn
Cho 2 số lớn X và Y:
X=(x
0

, x
1
, , x
n
)
Y=(y
0
, y
1
, , y
n
)
Z=X+Y=( (x
0
+y
0
) mod q , (x
1
+y
1
+nho
0
) mod q, ,(x
n
+y
n
+nho
n-1
) mod q )
trong đó nho

i
=(x
i
+y
i
+nho
i-1
)/q.
3.2.4 Phép nhân số lớn
Cho các số lớn X và Y. Tích Z của hai số này được định nghĩa như sau:
8
∑ ∑
+
= =+
===
nm
0k
j
kji
ik
k
k
yxzvoiqzY*XZ
3.2.4 Phép chia số lớn
Định lý: Cho X<qY. Giả sử X=x
0
+ +x
n
q
n

+x
n+1
q
n+1
, và Y=y
0
+ +y
n
q
n
. Nếu
x div y=q thì
X div Y= q hoặc q-1
Định lý là cơ sở giúp ta đoán nhanh thương của 2 số lớn X/Y với điều kiện
X<qY.
3.2.5 Phép luỹ thừa
- Tư tưởng cơ bản của phép luỹ thừa a
B
mod N
B=b
0
+b
1
2+b
2
2
2
+ +b
r
2

r
r
r
r
r
bb
bbbbb
B
aaaaa ) ().(
22
2 22
1
0
2
210
==
++++
3.3 Cài đặt chương trình
3.3.1 Mô tả qúa trình thực hiện
(0) Xây dùng một chương trình tìm và ghi lên một tệp các số nguyên tố nhỏ
hơn 2
16
. Tệp này có 6542 số nguyên tố, nó sẽ giúp chương trình bước
đầu tìm ra các ước nguyên tố nhỏ của một số lớn nào đó.
(1) Tìm các ước nguyên tố nhỏ của M
• Cho i và tính M=2
i
-1 bằng hàm Mersenne_SL(); in M
• Phân tích M bằng hàm Phân_tich_Word
a) đọc mét số nguyên tố a từ tệp các số nguyên tố nhỏ

9
b) Nếu M không chia hết cho a thì quay lên bước a) để đọc số tiếp theo.
Thực hiện phép chia M cho a, bằng hàm Chia_Word
- Nếu M chia hết cho a thì làm lại bước này đối với thương của phép
chia M cho a.
- Nếu đến một lúc nào đó ta thu được một thương bằng một số nguyên
tố trong tệp hoặc chia hết cho một số trong tệp thì dừng chương trình
và kết luận đã phân tích hoàn toàn và tích của các thừa số nguyên tố
là ước của M chính là bằng M.
- Nếu đọc hết tệp mà thương cuối cùng không trùng với bất kỳ số nào
trong tệp hoặc không chia hết cho bất cứ số nào trong tệp thì phải
phân tích xem thương này có phải là số nguyên tố không bằng cách
dùng hàm nguyên_to_SL. Nếu xác định thương này là nguyên tố thì
dừng chương trình và kết luận là “ phân tích hoàn toàn”. Ngược lại
thì chuyển sang giai đoạn (2).
(2) Dùng thuật toán Pollard_1 để phân tích ước hợp số Z của M
- Lấy ngẫu nhiên một số lớn a=Random_SL(Z); khởi đầu lấy Q=2;
- Dùng hàm UCLN_SL để tìm ước chung lớn nhất của Z và a
Q
-1.
Nếu UCLN này lớn hơn 1 thì đây sẽ là một ước của Z và in ra đã tìm
được ước. Ngược lại thì tăng Q lên 1 và làm lại bước này cho đến khi
tìm được một ước hoặc khi Q vượt qua một số Q
0
đủ lớn nào đó thì
dừng (thường ta chọn Q
0
=65356). Trong trường hợp này thì ta nói “
không phân tích hoàn toàn” .
10

3.4 Sơ đồ khối của các modules trong chương trình
a) Sơ đồ khối của chương trình chính
11
Begin
Input i
TÝnh
M=2
i
-1
T×m %íc nhá < 2
16
¦íc cßn l¹i
lµ nguyªn tè
Ph©n tÝch hoµn
toµn
Pollard
1=0
¦íc nguyªn tè
¦íc cßn l¹i
Kh«ng ph©n
tÝch hoµn toµn
T
T
F
F
b) Pollard_1
12
Input Z lµ hîp sè
i=2
X=random(Z)

X=X
i
mod Z
gdc(X-1, Z)=P
P>1
Pollard=1
P vµ Z=Z/P
lµ 2 %íc cña Z
i=i+1
i<I
0
Pollard=0
Kh«ng ph©n
tÝch ®%îc
F
T
F
T
Kết luận
Bài toán phân tích số nguyên ra thừa số nguyên tố ra đời từ rất lâu đã
được nhiều người biết đến và bỏ công sức ra nghiên cứu. Trong thời gian
làm đề tài tốt nghiệp em đã có dịp tìm hiểu và nghiên cứu xâu hơn về các
thuật toán phân tích số nguyên ra thừa số nguyên tố. Bắt đầu là những thuật
toán đơn giản như: thuật toán sàng Eratosthenes đến những thuật toán phức
tạp hơn như thuật toán sàng đồng dư và cuối cùng là những thuật toán rất
phức tạp như: thuật toán ρ của Pollard, thuật toán p-1 của Pollard.
Đồng thời, trong thời gian này, em đã học thêm được một số kỹ thuật
lập trình và một số thuật toán trong ngôn ngữ lập trình C++. Em đã biết phân
tích hệ thống để giải một bài toán phức tạp và có thể viết chương trình để
giải quyết bài toán đó.

Kết quả chính của đề tài là xây dựng được một chương trình có thể
phân tích được tất cả các số nguyên có dạng 2
n
-1, với n<=200, ra các thừa số
nguyên tố.
13

×