Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 51 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
51
Dung lượng
1,45 MB
Nội dung
CHUYÊN ĐỀ CÁC BÀI TOÁN SỐ HỌC I MỞ ĐẦU Trong nhiều toán Tin học, việc vận dụng kiến thức số học giúp đưa thuật toán tối ưu Mặt khác, toán Tin học có vận dụng kiến thức số học bản, địi hỏi cài đặt khơng q phức tạp em có tảng Tốn học tốt dễ dàng suy luận Từ kích thích niềm u thích em việc lập trình Các thuật toán số học tin học nội dung kiến thức quan trọng sử dụng nhiều thiết kế thuật tốn Tuy nhiên, q trình giảng dạy tơi thấy học sinh cịn khó khăn việc phân tích tốn để áp dụng thuật toán cài đặt giải toán Vì tơi chọn chun đề để giúp học sinh có hệ thống kiến thức toán học để giúp em dễ dàng giải toán cụ thể đối toán số học Nội dung chuyên đề chia thành ba phần: Mở đầu, Nội dung Kết luận Trong phần Nội dung (và phần chun đề) chúng tơi đề cập tới vấn đề chính: Số nguyên tố, Ước số, Bội số, Số Fibonacci, Số Catalan, Xử lí số nguyên lớn, Do chuyên đề toán số học nên kiến thức sở ứng dụng tập cụ thể Về mặt lí thuyết số học có nhiều tài liệu trình bày, tài liệu giáo khoa chuyên Tin hệ thống cụ thể Chuyên đề sưu tầm, chọn lọc, xếp hệ thống vấn đề toán số học theo mạch kiến thức định dựa số nguồn tài liệu có Cùng với đó, chúng tơi có đưa phân tích, đánh giá để làm sáng tỏ cho vấn đề đề cập tới Với cách tiếp cận mở vậy, hy vọng chuyên đề giúp em học sinh có hệ thống kiến thức cần thiết, thầy giáo có chun đề chun mơn bổ ích thiết thực skkn II NỘI DUNG Số nguyên tố 1.1 Định nghĩa Một số tự nhiên p (p>1) số nguyên tố p có hai ước số p Ví dụ số nguyên tố: 2, 3, 5, 7, 11, 13, 17, 19, 23, … 1.2 Kiểm tra tính nguyên tố theo định nghĩa Ý tưởng để kiểm tra số nguyên dương N (N>1) có số nguyên tố hay khơng, ta kiểm tra xem có tồn số nguyên mà k ước N (N chia hết cho k) N khơng phải số ngun tố, ngược lại N số nguyên tố bool IsPrime(int N) { if (N < 2) return flase; for(int i = 2; i < sqrt(N); i++) if(N%i==0) return flase; return true; } Tuy nhiên ta thấy cách không hiệu khì thời gian kiểm tra lâu Cải tiến kiểm tra tính nguyên tố số N cách kiểm tra xem N có chia hết cho số 2, số số có dạng đoạn bool { IsPrime (int N) if (N==2 || N==3) return true; if (N==1 || N%2==0 || N%3==0) return false; int k=-1; while (kint(sqrt(N)); } skkn 1.3 Kiểm tra số nguyên tố theo xác suất Các khái niệm, tính chất đồng dư thức, định lý cần nhớ định lý Ferma Ở đề cập đến định lý Ferma nhỏ tổng quát hóa định lý Ferma: Định lý Ferma nhỏ Nếu p số nguyên tố, với số nguyên a bất kỳ, ap-a chia hết cho p p Nghĩa a a(mod p) Một dạng tổng quát định lý là: p số nguyên tố m n m n số nguyên dương thỏa mãn m n(mod p 1) , a Z : a a (mod p) Định lý Fermat cịn tổng qt hóa Định lý Euler: với modulo n (n) 1(mod n) số nguyên a số nguyên tố với n, ta có: a Trong (n) kí hiệu hàm phi Euler đếm số số nguyên n nguyên tố với n Đây tổng quát hóa định lý nhỏ Fermat n=p số nguyên tố ( p) n 1.4 Liệt kê số nguyên tố đoạn [1,N] Cách Thử số m đoạn [1,N], kiểm tra tính nguyên tố m void OutPrime(int N) { for(int i = 2; i 1) c.pop_back(); return c; } BigInt operator * (const BigInt a, const int mul) { BigInt c; int carry = 0; for (int i = 0; i < (int)a.size(); i++) { carry += a[i] * mul; c.push_back(carry % BASE); carry /= BASE; } if (carry) c.push_back(carry); return c; } BigInt operator * (const BigInt a, const BigInt b) { BigInt c(a.size() + b.size() + 5, 0); for (int i = 0; i < (int)a.size(); i++) { int carry = 0; for (int j = 0; j < (int)b.size(); j++) { int k = i + j; c[k] += a[i] * b[j] + carry; carry = c[k] / BASE; c[k] %= BASE; } if (carry) c[i + b.size()] += carry; } while (*c.rbegin() == && c.size() > 1) c.pop_back(); return c; } bool operator < (BigInt a, BigInt b) { while (a.size() && *a.rbegin() == 0) a.pop_back(); while (b.size() && *b.rbegin() == 0) b.pop_back(); if (a.size() != b.size()) return a.size() < b.size(); for (int i = a.size() - 1; i >= 0; i ) if (a[i] != b[i]) return a[i] < b[i]; return false; } int main() { string sa, sb; cin >> sa >> sb; BigInt a = Init(sa); BigInt b = Init(sb); Print(a + b); if (a < b) { printf("-"); 38 skkn Print(b - a); } else { Print(a - b); } Print(a * b); return 0; } Bộ test tham khảo: (Có SPOJ) Bài 11 FUNCTION Cho hàm số tuyến tính Định nghĩa với Cho trước số A, B, n, x Tính Input: Một dịng gồm số Output: Một dòng đáp án Ví dụ: Input 3411 Output Hướng dẫn + Theo đề bài: g0(x) = x gn(x) = f (gn−1(x)) với n ≥ … + Tính: + Tính sử dụng kĩ thuật đệ quy + Tính : Ta có định lý Fermat nhỏ: p số nguyên tố với số tự nhiên b ta có + Áp dụng: với p số nguyên tố ta có: 39 skkn (đồng dư) Chương trình tham khảo #include #define Task "function" using namespace std; const int m = 1e9 + 7; long long a,b,x; unsigned long long n; long long power(long long k, long long h) { if(h == 0) { return 1; } else { long long temp = power(k, h/2)%m; if(h % == 0) return temp*temp%m %m; else return (temp*temp%m) * k%m; } } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); freopen(Task".inp", "r", stdin); freopen(Task".out", "w", stdout); cin >> a >> b >> n >> x; if(a==1) cout