Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 29 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
29
Dung lượng
202,59 KB
Nội dung
TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI II TIỂU LUẬN MƠN NGUN LÝ VÀ QUY TRÌNH CƠNG NGHỆ PHẦN MỀM GIẢNG VIÊN: PGS.TS Nguyễn Xuân Huy HỌC VIÊN: Nguyễn Văn Cường LỚP: Khoa học máy tính - K24 NĂM HỌC 2020 - 2021 MỤC LỤC Tài liệu tham khảo Nguyễn Thanh Tùng, Ngơn ngữ lập trình Python, Kỹ thuật lập trình Bùi Việt Hà, Python bản, Nhà Xuất Đại học Quốc Gia Hà Nội, 2020 Nguyễn Ngọc Giang (Chủ biên), Phan Xuân Vọng, Nguyễn Quốc Anh Đường vào lập trình Python, Nhà Xuất Đại học Quốc Gia Hà Nội, , 2020 Các tài liệu giáo trình chi tiết giúp bạn đọc tra cứu ngôn ngữ xem đại diện Cách mạng công nghệ 4.0 Hà Nội, 2021 Nguyễn Văn Cường Proper Factors Nếu số nguyên dương x chia hết cho số nguyên dương u u gọi ước số x Nếu u < x u gọi ước thực x Ví dụ, 12 có ước 1, 2, 3, 4, 12, số ước thực Có số nguyên dương khoảng 1M có số ước thực lớn 10 Algorithm Algorithm: Proper Factors Input: n=1M Output: n số lượng số có Ước thực >10 Method: • Tạo sàng số ước số [1 M] • dem=0 • For each p in SangUoc Nếu SangUoc[i]> 11 dem+1 • Return dem Program a=[] def alltau(n): global a a=[0,1]+[2]*(n-1) for i in range(2,n//2): ki=i+i while ki11: d+=1 print('so luong phan tu co hon 10 uoc thuc su:',d) Result So luong phan tu co hon 10 uoc thuc su 434718 Many Factors Tìm số có nhiều ước thực triệu số nguyên dương Algorithm Algorithm: Proper Factors Input: n=1M Output: n số lượng số có Ước thực >10 Method: • Tạo sàng số ước số [1 M] • dem=0 • For each p in SangUoc M=max(SangUoc) • Return M Program a=[] def alltau(n): global a a=[0,1]+[2]*(n-1) for i in range(2,n//2): ki=i+i while ki x Ví dụ, 12 số dơi Bạn hiển thị ba loại số số từ đến 1000 theo quy ước x- x số hụt x+ x số dôi x= x số hoàn thiện Algorithm Algorithm: Sum Of Proper Factors Input: n=1M Output: n số lượng số có Ước thực >10 Method: • For each I in (1 M) • Tong=0 • For each m in (1, i//2+1) If I %m==0 Tong+=m • If i==Tong ‘=I’ • If i>Tong ‘+I’ • If i=ival[i]: v-=ival[i] r+=rval[i] return r s=int(input('nhap so:')) print('so la ma:',ToRome(s)) Result nhap so:1948 so la ma: MCMXLVIII Roman Fibonacci Dãy Fibonacci F(i), i ≥ định nghĩa tổng quát sau: Nếu đặt a = 0, b = ta thu dãy Fibonacci nguyên thủy: 0, 1, 1, 2, 3, 5, 8, … Viết hàm RFib(n) cho số Rome Fibonacci thứ n Algorithm Algorithm: Roman Fibonacci Input: số nguyên n Output: số La mã Fibonacci thứ n Method: • Tính số Fibonacci thứ n • F0=0, F1=1 • For each I in (2, n+1) o Fi=Fi-2+Fi-1 • Return ToRom(F(n)) Program rval=["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"] ival=[1000,900,500,400,100,90,50,40,10,9,5,4,1] n=len(rval) def ToRom(v): #int v to string r='' for i in range(n): while v>=ival[i]: v-=ival[i] r+=rval[i] return r def RFibo(n): f=[0,1] for i in range(2, n+1): f.append (f[i-2]+f[i-1]) return ToRom(f[n]) t=int(input('nhap so:')) print('so Fibonaci thu ',t ,' la:',RFibo(t)) Result nhap so:7 so Fibonaci thu la: XIII Expression Tính trị biểu thức chứa biến a z, phép toán +, -, *, / với quy ước biến gán trị ngầm định a = 0, b = 1, …, z = 25 10 if 'a'b or b>16: print('loi co so',b) exit(1) if x==0: return if x ( ) -100000 16 Sieve of Eratosthenes Một số kiến thức Chúng ta nhắc lại số kiến thức phổ thông số nguyên tố Định nghĩa Số nguyên p ≥ số nguyên tố p chia hết cho Định nghĩa Số nguyên dương p số nguyên tố p có hai ước (là p) Mệnh đề Tập số nguyên dương chia thành ba tập con: • Tập chứa số số có ước: {1} • Tập số nguyên tố, số có hai ước: {2, 3, 5, 7, 11, …} • Tập số lại gọi hợp số, hợp số có hai ước: {4, 6, 8, 9, …} Mệnh đề Số số nguyên tố nhỏ chẵn tập số nguyên tố Mệnh đề Mọi số nguyên tố số lẻ Mệnh đề Có vơ hạn số nguyên tố Mệnh đề Số nguyên n > số nguyên tố n ước khoảng [2; ] Mệnh đề Số nguyên lẻ n > số nguyên tố n khơng có ước lẻ khoảng [3; ] Mệnh đề Số nguyên lẻ n > số nguyên tố n khơng có ước ngun tố khoảng [3; ] Như để xác định số nguyên tố ta phải sử dụng phép chia Vì phép nhân phép cộng thực đơn giản phép chia nên Eratosthenes, nhà toán học vĩ đại người Hy Lạp đề xuất ý tưởng tổ chức thuật tốn tìm tồn số nguyên tố khoảng từ đến giới hạn n cho trước Người đời sau gọi thuật toán Sàng Eratosthenes Bảng minh họa hoạt động thuật toán sàng với n = 100 Eratosthenes 276−194 trước CN Bài giảng Eratosthenes Bước Trò viết dãy số từ đến 100 bảng đất sét Trị có đủ 100 số từ đến 100 chưa bị xóa bảng Bước Xóa số 1, khơng phải số ngun tố hợp số số đặc biệt dãy số tự nhiên Bước Tìm số chưa bị xóa Gọi số i Bước Nếu i > 10 dừng thuật tốn Tồn số khơng bị xóa bảng số ngun tố Nếu i ≤ 10 trị thực Bước Bước Xóa bội số i kể từ i2 = i * i đến 100 Bước Lặp lại Bước 3 10 11 12 13 14 15 16 17 18 19 20 17 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 Sàng Eratosthenes với n = 100 (Các số bị xóa viết màu) Viết hàm Sieve(n) liệt kê số nguyên tố khoảng n Algorithm Algorithm: Sieve Input: số nguyên n Output: Sàng nguyên tố (1 n) Method: • Tạo mảng T[0] + n-1 phần tử nhận giá trị • For each I in (2 n) o For k in (i*I, n) T[i]=0 • Return T Program def F(n): print('call F') return int(n**0.5)#kiem tra can n dc tinh may lan def sieve(n): s=bytearray([1]*(n+1)) s[0]=s[1]=0 for i in range(4,n+1,2): s[i]=0 for i in range(3, F(n)+1,2): if s[i]: for j in range(i*i,n+1,i): s[j]=0 return s n = 100 s = Sieve(n) for i in range(n): if s[i]: print(i, end=' ') Result 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 18 10001st prime Problem Project Euler Trong dãy số nguyên tố 2, 3, 5, 7, 11, 13,… số nguyên tố thứ sáu tính từ 13 Hãy hiển thị số nguyên tố thứ 10001 ? Algorithm Algorithm: 10001 Prime Input: sàng số nguyên tố (1 1M) Output: số nguyên tố thứ 10001 Method: • Tạo mảng s[0,0] + M-1 phần tử nhận giá trị • For each I in (2, M) o Nếu s[i]=1 o For k in (i*I, M+1) s[i]=0 • Tạo mảng p có s.count(1) phần tử • For each I in (0, M+1) o Nếu s[i]=1 p[j]=i • Return p[10001-1]) Program def sieve(n): s=[0,0]+[1]*(n-1) for i in range (2,int (n**0.5)+1): if s[i]: for j in range(i*i,n+1,i): s[j]=0 return s def Prime(t): p=[0]*t.count(1) j=-1 for i in range(0,n+1): if t[i]: j=j+1 p[j]=i return p n=1000000 p=Prime(sieve(n)) k=10001 print('so ngto thu', k, ' la:',p[k-1]) Result so ngto thu 10001 la: 104743 19 2P Prime Số nguyên dương p gọi số nguyên tố hai chiều p số lật p' khác số nguyên tố Ví dụ, 13 31 số nguyên tố hai chiều Hãy liệt kê số nguyên tố hai chiều khoảng từ đến 5K = 5000 Algorithm Algorithm: 2P Prime Input: n=5K Output: danh sách số nguyên tố chiều 15K Method: • n=5K số đảo lớn nđảo= 9994 • s=[] • Tạo sàng số nguyên tố m có nđảo+1 số • For each I in (2, n+1) o Nếu I I đảo số nguyên tố s.append(i) • Return s Program def sieve(n):#tao sang s=[0,0]+[1]*(n-1) for i in range (2,int (n**0.5)+1): if s[i]: for j in range(i*i,n+1,i): s[j]=0 return s def rev(x):#dao y=0 while x!=0: y=y*10+x%10 x//=10 return y def p2primeB(n):#tao mang doi xung s=[] m=rev(n-1)+1 sangnt=sieve(m) for p in range(2, n+1): if sangnt[p] and sangnt[rev(p)]: s.append(p) return s s=p2primeB(5000) print(s) Result [2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97, 101, 107, 113, 131, 149, 151, 157, 167, 179, 181, 191, 199, 311, 313, 337, 347, 353, 359, 373, 383, 389, 701, 709, 727, 733, 739, 743, 751, 757, 761, 769, 787, 797, 907, 919, 929, 937, 941, 953, 967, 971, 983, 991, 1009, 1021, 1031, 1033, 1061, 1069, 1091, 1097, 1103, 1109, 1151, 1153, 1181, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1279, 1283, 1301, 1321, 1381, 1399, 1409, 1429, 1439, 1453, 1471, 1487, 1499, 1511, 1523, 1559, 1583, 1597, 1601, 1619, 1657, 1669, 1723, 1733, 1741, 1753, 1789, 1811, 1831, 1847, 1867, 20 1879, 1901, 1913, 1933, 1949, 1979, 3011, 3019, 3023, 3049, 3067, 3083, 3089, 3109, 3121, 3163, 3169, 3191, 3203, 3221, 3251, 3257, 3271, 3299, 3301, 3319, 3343, 3347, 3359, 3371, 3373, 3389, 3391, 3407, 3433, 3463, 3467, 3469, 3511, 3527, 3541, 3571, 3583, 3613, 3643, 3697, 3719, 3733, 3767, 3803, 3821, 3851, 3853, 3889, 3911, 3917, 3929] Palindromic Prime Số nguyên dương p gọi số nguyên tố đối xứng p số nguyên tố viết p xuôi hay ngược p Ví dụ, 919 số nguyên tố đối xứng Liệt kê số nguyên tố đối xứng khoảng từ đến 1M = 1000000 Algorithm Algorithm: Palindromic Prime Input: n=1M Output: danh sách số nguyên tố đối xứng 11M Method: • Tạo sàng số nguyên tố s • t=[] • For each I in (1, 1M) o Nếu s[i]=rev(s[i]) t.append(s[i]) • Return t Program def sieve(n): s=[0,0]+[1]*(n-1) for i in range (2,int (n**0.5)+1): if s[i]: for j in range(i*i,n+1,i): s[j]=0 return s def rev(x): y=0 while x!=0: y=y*10+x%10 x//=10 return y def Prime(t): p=[0]*t.count(1) j=-1 for i in range(0,n+1): if t[i]: j=j+1 p[j]=i return p def PaPrime(s): a=[] n=len(s) for i in range(0,n): if (s[i]==rev(s[i])): a.append(s[i]) 21 return a n=1000000 t=sieve(n) p=Prime(t) a=PaPrime(p) print('Mang nguyen to doi xung:\n',a) Result Mang ng to dx: [2, 3, 5, 7, 11, 101, 131, 151, 181, 191, 313, 353, 373, 383, 727, 757, 787, 797, 919, 929, 10301, 10501, 10601, 11311, 11411, 12421, 12721, 12821, 13331, 13831, 13931, 14341, 14741, 15451, 15551, 16061, 16361, 16561, 16661, 17471, 17971, 18181, 18481, 19391, 19891, 19991, 30103, 30203, 30403, 30703, 30803, 31013, 31513, 32323, 32423, 33533, 34543, 34843, 35053, 35153, 35353, 35753, 36263, 36563, 37273, 37573, 38083, 38183, 38783, 39293, 70207, 70507, 70607, 71317, 71917, 72227, 72727, 73037, 73237, 73637, 74047, 74747, 75557, 76367, 76667, 77377, 77477, 77977, 78487, 78787, 78887, 79397, 79697, 79997, 90709, 91019, 93139, 93239, 93739, 94049, 94349, 94649, 94849, 94949, 95959, 96269, 96469, 96769, 97379, 97579, 97879, 98389, 98689] Twin Primes Mỗi cặp số nguyên tố (p-2, p) gọi cặp số nguyên tố sinh đôi Hãy liệt kê cặp số nguyên tố sinh đôi 1M Algorithm Algorithm: Palindromic Prime Input: n=1M Output: danh sách số nguyên tố đối xứng 11M Method: • Tạo sàng số nguyên tố s • For each I in (1, 1M) o Nếu s[i]+2==s[i+1] print(s[i], s[i+1]) Program def sieve(n): s=[0,0]+[1]*(n-1) for i in range (2,int (n**0.5)+1): if s[i]: for j in range(i*i,n+1,i): s[j]=0 return s def rev(x): y=0 while x!=0: y=y*10+x%10 x//=10 return y def Prime(t): p=[0]*t.count(1) j=-1 for i in range(0,n+1): 22 if t[i]: j=j+1 p[j]=i return p #n=1000000 n=1000 t=sieve(n) p=Prime(t) d=0 print('\nSo cap nguyen to sinh doi1 1000:\n') for i in range(0, len(p)-1): if p[i]+2==p[i+1]: d+=1 print('(',p[i],p[i+1],')',end=' ') print('\nSo cap nguyen to sinh doi:',d) #print('\nSo cap nguyen to sinh doi1 1M:',d) Result So cap nguyen to sinh doi 1M: 8169 Cap so nguyen to sinh doi 1000 : ( ) ( ) ( 11 13 ) ( 17 19 ) ( 29 31 ) ( 41 43 ) ( 59 61 ) ( 71 73 ) ( 101 103 ) ( 107 109 ) ( 137 139 ) ( 149 151 ) ( 179 181 ) ( 191 193 ) ( 197 199 ) ( 227 229 ) ( 239 241 ) ( 269 271 ) ( 281 283 ) ( 311 313 ) ( 347 349 ) ( 419 421 ) ( 431 433 ) ( 461 463 ) ( 521 523 ) ( 569 571 ) ( 599 601 ) ( 617 619 ) ( 641 643 ) ( 659 661 ) ( 809 811 ) ( 821 823 ) ( 827 829 ) ( 857 859 ) ( 881 883 ) So cap nguyen to sinh doi: 35 Circular Primes Problem 35 Project Euler Số nguyên dương p > gọi số nguyên tố vòng thân p lần quay p vị trí nhận số ngun tố Ví dụ, có số ngun tố vòng khoảng 20 : 11 → 11, 13 → 31, 17 → 71, 19 → 91 Hãy liệt kê số nguyên tố vòng khoảng 10 1M Algorithm Algorithm: Palindromic Prime Input: n=1M Output: danh sách số ngun tố vịng 101M Method: • Tạo sàng số nguyên tố s • T=[] • For each I in (10, 1M) o Nếu s[i] chứa {0,2,4,6,8} không số nguyên tố vòng o Nếu tập Rote(s[i]) số nguyên tố 23 T.append(s[i]) • Return T Program def sieve(n): s=[0,0]+[1]*(n-1) for i in range (2,int (n**0.5)+1): if s[i]: for j in range(i*i,n+1,i): s[j]=0 return s def Prime(t): p=[0]*t.count(1) j=-1 for i in range(0,n+1): if t[i]: j=j+1 p[j]=i return p def NewContain(x): s=str(x) for d in s: if d in '024568': return True return False def Del(p): a=p #print(a) i=0 while i số sau: Hàm cho giá trị nhỏ đáp ứng điều kiện sau: a dãy đồng (mọi số nhau): a dãy tăng chặt: a dãy tăng: a dãy giảm chặt: a dãy giảm : ngồi trường hợp Ví dụ 3 11 17 20 8 11 6 6 12 Algorithm Nếu ta dùng biến ghi nhận bước tăng t, giảm g b chuyển từ a[i-1] sang a[i] sau lần duyệt ta thu tình sau: g t b val 0 1 Rhyth m 25 0 1 0 1 1 1 Rhythm 2 3 4 5 = (4*g+2*t+b)%7%5 Bạn dễ dàng nhận Rhythm số nhị phân ba (g, t, b) Trong t = 1: có bước tăng, t = 0: khơng có bước tăng b = 1: có bước bằng, b = 0: khơng có bước g = 1: có bước giảm, g = 0: khơng có bước giảm g=t=b=0 for i in range(1, len(a)): if a[i] == a[i - 1]: b=1 elif a[i] > a[i - 1]: t=1 else: g=1 Vì n > nên khơng xảy tình g = t = Với tình liệt kê ta tính giá trị từ đến theo hệ nhị phân val = 4*g + 2*t + b Năm giá trị ứng với trị hàm Rhythm, riêng hai trường hợp val = ứng với giá trị val = * g + * t + b if val < 6: return val else: return Để ý val < ta có (val % 7) % = val % = val Khi val = ta có (val % 7) % = val % = % = Khi val = ta có (val % 7) % = % = Nhận xét giúp ta viết gọn hàm Rhythm chương trình đây: Program """ Rhythm.py a[0] = a[1] = = a[n-1] a[0] < a[1] < < a[n-1] a[0] a[n-1] a[0] >= a[1] >= >= a[n-1] elsewhere 26 """ a = [3, 3, 3, 3, 3, 3, 3, 3, 3] b = [3, 4, 6, 8, 11, 17, 20, 22, 30] c = [3, 4, 6, 6, 11, 11, 20, 22, 30] def Rhythm(x): g=t=b=0 for i in range(1, len(x)): if x[i] == x[i - 1]: b=1 elif x[i] > x[i - 1]: t=1 else: g=1 return (4 * g + * t + b) % % print(a, ':', Rhythm(a)) print(b, ':', Rhythm(b)) print(c, ':', Rhythm(c)) d=a+b e=b+a b.reverse() print(b, ':', Rhythm(b)) c.reverse() print(c, ':', Rhythm(c)) print(d, ':', Rhythm(d)) e.reverse() print(e, ':', Rhythm(e)) Để test chương trình ta dùng ba mảng a, b c, a chứa giá trị đồng nhất, b gồm giá trị tăng chặt, c gồm giá trị tăng Với trợ giúp hàm lật danh sách reverse cộng danh sách, ta tạo thêm tình khác Result [3, 3, 3, 3, 3, 3, 3, 3, 3] : [3, 4, 6, 8, 11, 17, 20, 22, 30] : [3, 4, 6, 6, 11, 11, 20, 22, 30] : [30, 22, 20, 17, 11, 8, 6, 4, 3] : [30, 22, 20, 11, 11, 6, 6, 4, 3] : [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 6, 8, 11, 17, 20, 22, 30] : [3, 3, 3, 3, 3, 3, 3, 3, 3, 30, 22, 20, 17, 11, 8, 6, 4, 3] : Collatz Problem Nhà Toán học Đức Lothar Collatz xây dựng dãy số mang tên ông dãy Collatz sau: 27 Ký hiệu Len(n) = chiều dài dãy Collatz(n) Ví dụ Len(1) = 1, Len(3) = (3 → 10 → → 16 → → → → 1) Bạn cho biết số khoảng 1M có len dài ? Algorithm Algorithm: Collatz Input: số nguyên n Output: Mảng T[1 n] chứa chiều dài dãy Collatz số I tương ứng Method: • Tạo mảng T[1 n] phần tử nhận giá trị • For each I in (1 n) o D=0 o While i1 If I chẵn i=I div ; D=D+1 If I lẻ i=3*i+1; D=D+1 o Return T[i]=d • Tìm I có T[i] max Program def Len_n(n): d=1 while n>1 : if n%2==0:# chan thi chia n=n//2 d=d+1 else:# le nhan 3+1 n=3*n+1 28 d=d+1 return d a=[0] for i in range(1,1000001): sl=Len_n(i) a.append(sl) #print(a,' ') print('chieu dai lon nhat:',max(a)) print('So co chieu dai lon nhat:',a.index(max(a))) Result chieu dai lon nhat: 525 So co chieu dai lon nhat: 837799 Oct 01 2021 29 ... tố p có hai ước (là p) Mệnh đề Tập số nguyên dương chia thành ba tập con: • Tập chứa số số có ước: {1} • Tập số nguyên tố, số có hai ước: {2, 3, 5, 7, 11, …} • Tập số cịn lại gọi hợp số, hợp... lập trình Python, Kỹ thuật lập trình Bùi Việt Hà, Python bản, Nhà Xuất Đại học Quốc Gia Hà Nội, 2020 Nguyễn Ngọc Giang (Chủ biên), Phan Xuân Vọng, Nguyễn Quốc Anh Đường vào lập trình Python, Nhà... Eratosthenes 276−194 trước CN Bài giảng Eratosthenes Bước Trò viết dãy số từ đến 100 bảng đất sét Trị có đủ 100 số từ đến 100 chưa bị xóa bảng Bước Xóa số 1, khơng phải số nguyên tố hợp số số đặc biệt dãy