Trong điện toán, phép toán modulo là phép toán tìm số dư của phép chia 2 số (đôi khi được gọi là modulus).
Cho hai số dư, (số bị chia) và (số chia) , modulo (viết tắt là ) là số dư của phép chia có dư Euclid của cho . Ví dụ, biểu thức "5 mod 2" bằng 1 vì 5 chia cho 2 có thương số là 2 là số dư là 1, trong khi "9 mod 3" bằng 0 do 9 chia 3 có thương số là 3 và số dư 0; không còn gì trong phép trừ của 9 cho 3 nhân 3. (Lưu ý rằng thực hiện phép chia bằng máy tính cầm tay sẽ không hiển thị kết quả giống như phép toán này; thương số sẽ được biểu diễn dưới dạng phần thập phân.)
Mặc dù thường được thực hiện khi và đều là số nguyên, nhiều hệ tính toán cho phép sử dụng các kiểu khác của toán học bằng số. Giới hạn của một modulo nguyên của là từ 0 đến . ( mod 1 luôn bằng 0; là không xác định, có thể trả về lỗi chia cho số 0 trong nhiều ngôn ngữ lập trình.) Xem số học mô-đun để tìm các quy ước cũ hơn và liên quan được áp dụng trong lý thuyết số.
Khi hoặc hoặc là số âm, định nghĩa cơ bản bị phá vỡ và các ngôn ngữ lập trình khác nhau trong việc định nghĩa các kết quả này.
Tính toán phần dư trong phép toán modulo
thumb| Thương số () và [[số dư () theo các hàm của số bị chia (), bằng cách dùng các thuật toán khác nhau]]
Trong toán học, kết quả của phép toán modulo là số dư của phép chia có dư. Tuy vậy các quy ước khác vẫn tồn tại. Máy vi tính và máy tính có nhiều cách khác nhau để lưu trữ và đại diện cho các số; do đó định nghĩa của chúng về phép toán modulo phụ thuộc vào ngôn ngữ lập trình hoặc phần cứng máy tính bên dưới cơ bản.
Trong hầu hết các hệ thống máy tính, thương số và số dư của phép chia cho thỏa mãn |
Tuy nhiên, vẫn còn sự nhập nhằng về dấu nếu số dư khác không: hai lựa chọn có thể cho số dư xảy ra, một âm và một dương, và hai lựa chọn cho thương số xảy ra. Trong lý thuyết số, thông thường số dư dương luôn được chọn, nhưng lựa chọn của các ngôn ngữ lập trình tùy thuộc vào ngôn ngữ và dấu của hoặc . Ngôn ngữ Pascal và ALGOL 68 tiêu chuẩn chọn số dư dương (hoặc 0) kể cả khi số chia là các số âm, đối với một vài ngôn ngữ lập trình như C90 thì dấu tùy thuộc vào cài đặt khi hoặc hoặc là số âm. Xem bảng để biết chi tiết. modulo 0 là không xác định trong hầu hết các hệ thống, mặc dù một số hệ thống định nghĩa là .
Theo mô tả của Leijen,
Tuy nhiên, Boute tập trung vào các tính chất của chính phép toán modulo và không đánh giá sự thật là phép chia rút gọn (tiếng Anh: truncated division) cho thấy sự đối xứng của và , mà cũng giống phép chia thông thường. Bởi vì cả hai phép chia sàn và phép chia có dư đều không có tính đối xứng này, phán đoán của Boute ít nhất là không toàn diện.
Các sai lầm thông thường
Nếu kết quả của phép chia modulo có dấu của số bị chia thì sẽ dẫn đến các sai lầm đáng ngạc nhiên.
Ví dụ, để kiểm tra tính lẻ của một số nguyên, ta có thể kiểm tra số dư khi chia cho có bằng 1:
bool is_odd(int n) {
return n % 2 == 1;
}
Khi ngôn ngữ lập trình có số dư có dấu của số bị chia, việc kiểm tra sẽ sai, do khi (số bị chia) là số âm lẻ, mod 2 trả về −1, và hàm trả về false.
Có thể sửa lại sai lầm đó bằng cách kiểm tra rằng kết quả khác 0 (do số dư bằng 0 được xem xét như nhau bất kể dấu):
bool is_odd(int n) {
return n % 2 != 0;
}
Hay là, bằng việc hiểu trước rằng với bất kỳ số lẻ nào, số dư modulo có thể hoặc bằng 1 hoặc −1:
bool is_odd(int n) {
return n % 2 == 1 || n % 2 == -1;
}
Ký hiệu
Một số máy tính cầm tay có nút của hàm , và nhiều ngôn ngữ lập trình khác có hàm tương tự, biểu diễn cho . Một vài ngôn ngữ hỗ trợ các biễu thức mà dùng "%", "mod", hoặc "Mod" là toán tử modulo hoặc toán tử lấy số dư, chẳng hạn
:a % n
hoặc
:a mod n
hoặc tương đương cho môi trường thiếu hàm (chú ý rằng kiểu 'int' vốn đã sinh ra giá trị rút gọn )
:a - (n * int(a/n))
Vấn đề hiệu suất
Phép toán modulo có thể được cài đặt sao cho mỗi lần phép chia với số dư được tính. Đôi với nhu cầu đặc biệt, trên vài phần cứng, tồn tại các phép toán tương tự nhưng nhanh hơn. Ví dụ, modulo cho lũy thừa của 2 có thể biễu diễn tương đương bởi phép toán bitwise AND:
:x % 2n == x & (2n - 1)
Ví dụ (giả sử là số nguyên dương):
:x % 2 == x & 1
:x % 4 == x & 3
:x % 8 == x & 7
Trong các thiết bị và phần mềm mà cài đặt toán tử bitwise hiệu quả hơn toán tử modulo, các dạng thay thế này có thể dẫn đến tính toán nhanh hơn.
Các trình biên dịch tối ưu hóa có thể nhận diện các biểu thức có dạng expression % constant
trong đó constant
là lũy thừa của 2 và tự động cài đặt chúng thành expression & (constant-1)
. Điều này cho phép viết mã rõ ràng hơn mà không ảnh hưởng đến hiệu suất. Cách tối ưu hóa này không áp dụng cho các ngôn ngữ mà kết quả của phép toán modulo có cùng dẫu với số bị chia (bao gồm C), trừ phi số bị chia là kiểu số nguyên không dấu. Bởi vì nếu số bị chia là số âm thì modulo sẽ là số âm trong khi expression & (constant-1)
sẽ luôn dương.
Tính tương đương
Một số phép toán modulo có thể được mở rộng tương tự sang các phép toán toán học khác. Điều này có tính hữu dụng trong các chứng minh mật mã học, chẳng hạn trao đổi khóa Diffie-Hellman.
*Phần tử đơn vị:
.
với mọi số nguyên dương .
Nếu là số nguyên tố không phải là ước số của , thì , dựa theo định lý nhỏ Fermat.
Phần tử đảo:
.
kí hiệu phần tử đảo modular, được định nghĩa khi và chỉ khi và là các số nguyên tố cùng nhau, khi vế trái xác định: .
Tính phân phối:
.
*.
Phép chia (định nghĩa): , khi vế phải xác định (là khi và math|n là các số nguyên tố cùng nhau). Các trường hợp còn lại là không xác định.
*Phép nhân nghịch đảo: .
Dấu Mod trong các ngôn ngữ lập trình
👁️
1 | 🔗 | 💖 | ✨ | 🌍 | ⌚
Trong điện toán, phép toán **modulo** là phép toán tìm số dư của phép chia 2 số (đôi khi được gọi là _modulus_). Cho hai số dư, (số bị chia) và (số chia) , modulo
Trong toán học, **nhóm nhân các số nguyên modulo _n**_ là một nhóm với phép nhân là phép toán nhóm và các phần tử là các đơn vị đơn vị trong một vành : với
**Căn nguyên thủy modulo _n**_ là một khái niệm trong số học modulo của lý thuyết số. ## Khái niệm Nếu _n_ ≥ 1 là một số nguyên thì các số nguyên nguyên tố cùng
**Thuật toán RHO** (còn gọi là thuật toán **Pollard's rho**) là một thuật toán phân tích số nguyên thành thừa số. được phát minh bởi John Pollard vào năm 1975. Nó tỏ ra hiệu quả
Bài này nói về từ điển các chủ đề trong toán học. ## 0-9 * -0 * 0 * 6174 ## A * AES * ARCH * ARMA * Ada Lovelace * Adrien-Marie Legendre *
thumb|right|Chiếc đồng hồ với mô đun bằng 12 Trong toán học, **số học mô đun** là một hệ thống số học dành cho số nguyên. Trong số học mô đun, các con số được viết
**Lôgarit rời rạc** là sự tiếp nối của phép tính lôgarit trên trường số thực vào các nhóm hữu hạn. Ta nhắc lại rằng với hai số thực x, y và cơ số _a_>0, _a_≠1,nếu
thumb|right|Các thao tác bước xoay [[Rubik|khối lập phương Rubik tạo thành nhóm khối lập phương Rubik.]] Trong toán học, một **nhóm** (group) là một tập hợp các phần tử được trang bị một phép toán
Bài viết này là **danh sách các thuật toán** cùng một mô tả ngắn cho mỗi thuật toán. ## Thuật toán tổ hợp ### Thuật toán tổ hợp tổng quát * Thuật toán Brent: tìm
thumb|Thuật toán Euclid để tìm ước chung lớn nhất (ƯCLN) của hai đoạn thẳng BA và DC, độ dài của cả hai đều là bội của một "đơn vị" độ dài chung. Vì độ dài
**Thuật toán nhân lũy thừa bằng bình phương** hoặc t**huật toán bình phương và nhân** là thuật toán tính nhanh lũy thừa tự nhiên của một số (thực hoặc nguyên), trong trường hợp cơ số
**Thuật toán Luhn** hoặc **công thức Luhn**, cũng được biết là thuật toán "modulus 10" hay "mod 10", nó được đặt theo tên người sáng tạo ra nó, nhà khoa học của IBM Hans Peter
**Giải thuật Euclid mở rộng** được sử dụng để giải một phương trình vô định nguyên (còn được gọi là phương trình Đi-ô-phăng) có dạng
Trong đó làTrong toán học, **nhóm Heisenberg** , được đặt tên theo nhà toán học Werner Heisenberg, là nhóm các ma trận tam giác trên 3 × 3 dưới dạng ::
thumb|[[Nhóm đối xứng của một bông tuyết là D6, giống với đối xứng nhị diện của lục giác]] Trong toán học, một **nhóm nhị diện** là một nhóm các đối xứng của một đa giác
**Số nguyên tố an toàn** là một số nguyên tố có dạng với _p_ cũng là số nguyên tố. (Theo quy ước, số nguyên tố _p_ được gọi là số nguyên
Trong mật mã học, **Advanced Encryption Standard** (tiếng Anh, viết tắt: **AES**, nghĩa là **Tiêu chuẩn mã hóa tiên tiến**) là một thuật toán mã hóa khối được chính phủ Hoa Kỳ áp dụng làm
Trong mật mã học, **MD5** (viết tắt của tiếng Anh **Message-Digest algorithm 5**, Thuật toán Tiêu hóa-tin nhắn 5) là một hàm băm mật mã học được sử dụng phổ biến với giá trị băm
thế=|nhỏ|Nguyên tắc của mật mã Caesar là văn bản mã được tạo ra bằng cách thay thế mỗi chữ cái trong văn bản với một chữ cái cách nó một đoạn cho trước trong bảng
Trong toán học, **số dư** là lượng "còn lại" sau khi thực hiện một số tính toán. Trong số học, phần còn lại là số nguyên "còn lại" sau khi chia một số nguyên cho
nhỏ|Chiếc bánh pizza được cắt nhỏ; mỗi miếng bánh là chiếc bánh. **Phân số đơn vị** là phân số dương có tử số bằng 1, tức có dạng với là
**Nhóm thương** hay **nhóm nhân tử** là nhóm thu được bằng cách gộp các phần tử tương tự với nhau của nhóm lớn hơn, dùng quan hệ tương đương để bảo toàn một số cấu
Trong lý thuyết nhóm, một **nhóm cyclic** (hay **nhóm xyclic**, hay **nhóm monogenous**) là một nhóm có thể được sinh ra từ một tập hợp sinh chỉ gồm một phần tử _g_, phần tử này
Trong viễn thông (_telecommunication_), **mã Hamming** là một mã sửa lỗi tuyến tính (_linear error-correcting code_), được đặt tên theo tên của người phát minh ra nó, [./Https://en.wikipedia.org/wiki/Richard_Hamming Richard Hamming]. Mã Hamming có thể phát
Trong toán học, **không gian Hilbert** (Hilbert Space) là một dạng tổng quát hóa của không gian Euclid mà không bị giới hạn về vấn đề hữu hạn chiều. Đó là một không gian có
**Quy tắc chia hết** hay **dấu hiệu chia hết** là các cách nhanh để xác định xem một số nguyên đã cho có chia hết cho một số chia (ước) cụ thể hay không mà
nhỏ| là nhóm , tức là [[Số học mô đun|tập các số nguyên mô đun 8 dưới phép cộng.Nhóm con chỉ chứa 0 và 4. Có bốn lớp kề của : chính , , ,
**Trao đổi khóa Diffie–Hellman** (**D-H**) là một phương pháp trao đổi khóa được phát minh sớm nhất trong mật mã học. Phương pháp trao đổi khóa Diffie–Hellman cho phép hai bên (người, thực thể giao
nhỏ| Một [[Lục giác|hình lục giác có 20 phân hoạch thành một tập con ba phần tử và ba tập con một phần tử (không màu) (hình phía trên). Trong số này, có bốn phân
Trong lý thuyết nhóm, một tập con của một nhóm có thể là một nhóm hoặc không. Trong trường hợp nó là một nhóm, nó được gọi là **nhóm con** của G. ## Định nghĩa
Trong toán học, một **cơ sở Gröbner** của một i-đê-an của vành đa thức _K_[_X_,...,_X_] là một tập hợp sinh của i-đê-an này, cùng với một vài thuộc tính bổ sung nhất định. Khái niệm
Trong đại số tuyến tính, **thương** của một không gian vectơ _V_ với một không gian vectơ con _N_ là một không gian vectơ thu được khi "thu gọn" _N_ về không. Không gian thu
**Định lý nhỏ của Fermat** (hay định lý Fermat nhỏ - phân biệt với định lý Fermat lớn) khẳng định rằng nếu là một số nguyên tố, thì với số nguyên bất kỳ,
**Kiểm tra Solovay-Strassen** là một trong các phương pháp kiểm tra tính nguyên tố theo xác suất do Robert M. Solovay và Volker Strassen phát triển. ## Ký hiệu Legendre và tiêu chuẩn Euler ###
Trong ngành mật mã học, phương pháp **IDEA** (_International Data Encryption Algorithm_) là một phương pháp mã khối. Được phát triển bởi Lai Học Gia (來學嘉) và James L.Massey của ETH Zurich và được công
Trong lý thuyết nhóm, thuật ngữ **cấp** (tiếng Anh: _order_) có hai ý nghĩa, cả hai ý nghĩa này đều liên hệ mật thiết với nhau: * cấp của một nhóm _G_ chính là số
thumb|alt=Cân thăng bằng trống|Hai đĩa cân thăng bằng này chứa không đồ vật, chia ra làm hai nhóm bằng nhau. Không là số chẵn. Nói theo cách khác, _tính chẵn lẻ_ của nó—đặc tính của
Glen Beck (hậu cảnh) và [[Betty Holberton|Betty Snyder (tiền cảnh) đang lập chương trình ENIAC trong tòa nhà BRL 328. (Ảnh Quân đội Hoa Kỳ, khoảng năm 1947-1955)|nhỏ|phải]] **ENIAC** ( hay **Electronic Numerical Integrator and
**Lý thuyết số** là một ngành của toán học lý thuyết nghiên cứu về tính chất của số nói chung và số nguyên nói riêng, cũng như những lớp rộng hơn các bài toán mà
Trong toán học, một số hàm tử nhất định có thể được _dẫn xuất_ thành một số hàm tử mới. Phép toán này, dù khá trừu tượng, thống nhất một số kiến tạo trong toán
Trong lý thuyết số, **số Carmichael** là một hợp số thỏa mãn quan hệ đồng dư số học mô-đun : : cho tất cả các số nguyên nguyên tố cùng nhau
**Kiểm tra Fermat** là một thuật toán xác suất kiểm tra một số tự nhiên là hợp số hay là số nguyên tố. ## Khái niệm Định lý nhỏ Fermat phát biểu rằng nếu _p_
thumb|Chân dung [[François Viète]] Trong toán học, **định lý Viète** hay **hệ thức Viète** (tiếng Pháp: _Relations de Viète_) do nhà toán học Pháp François Viète tìm ra, nêu lên mối quan hệ giữa các
Trong toán học và khoa học máy tính, hàm **floor** (**phần nguyên nhỏ hơn**) và **ceiling** (**phần nguyên lớn hơn**) là các quy tắc cho tương ứng một số thực vào một số nguyên gần
thumb| với giá trị . Trong số học, **lập phương** của một số _n_ có nghĩa là nhân 3 lần giá trị của nó với nhau: :. Hay cũng có thể hiểu là lấy tích
**Giả thuyết ABC** là một giả thuyết toán học, được phát biểu ban đầu năm 1985 bởi Joseph Oesterlé và được tổng quát hóa sau đó bởi David Masser. Giả định này có thể liên
thumb|[[Đồ thị nửa lôgarit của các nghiệm của phương trình cho số nguyên , , và , với . Dải màu xanh lá cây đánh dấu các giá trị được chứng
**Kiểm tra tính nguyên tố** (tiếng Anh: _primality test_) là bài toán kiểm tra xem một số tự nhiên có phải là số nguyên tố hay không. Bài toán này đặc biệt trở nên
Trong lập trình máy tính, đặc biệt là khi sử dụng mô phạm lập trình mệnh lệnh, **assertion** (có thể dịch là **xác quyết**) là một vị ngữ (tức hàm có giá trị Boolean lên
Trong toán học, các số nguyên _a_ và _b_ được gọi là **nguyên tố cùng nhau** (tiếng Anh: **coprime** hoặc **relatively prime**) nếu chúng có Ước số chung lớn nhất là 1. Ví dụ 5