Hỏi đáp
Chia sẻ kiến thức, cùng nhau phát triển
Mình có dòng code sau:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Hill_Cipher
{
class Program
{
static void Main(string[] args)
{ //Khai báo
int i, j, sum = 0, end = 0;
int[,] mtrx = new int[25, 25];
int[,] ans = new int[25, 1];
int m ;
string text = "";
//m
Console.WriteLine("Nhap m:");
m = int.Parse(Console.ReadLine());
//Nhập mã khóa
Console.WriteLine("Nhap key:");
for (i = 0; i < m; i++)
{
for (j = 0; j < m; j++)
{
Console.Write("Phan tu - [{0}],[{1}]: ", i, j);
mtrx[i, j] = int.Parse(Console.ReadLine());
}
}
//Input
Console.WriteLine("Nhap van ban");
Console.Write("\n");
text = Console.ReadLine();
Console.Write("\n");
char[] txt = text.ToCharArray();
end = txt.Length;
for (i = 0; i < end; i++)
{
txt[i] = Convert.ToChar(txt[i]-'a');
}
//Ma trận
for (i = 0; i < end; i++)
{
sum = 0;
for (j = 0; j < end; j++)
{
sum += mtrx[i, j] * (int)txt[j];
}
ans[i, 0] = sum;
}
//Output
Console.Write("Van ban da ma hoa:");
for (i = 0; i < end; i++)
{
char cipher = (char)(((ans[i, 0]) % 26)+97);
Console.Write("\t" + cipher);
}
Console.ReadKey();
}
}
}
khi nhập m=2
k:
3
2
3
5
văn bản: help
kết quả đúng: dple
nhưng bài của mình lại ra: dpaa
Mong các bạn fix dùm mình cảm ơn nhiều!
https://goo.gl/msJqZL đây là hình ảnh mình debug .
Mình nhìn code bạn và suy đoán hướng mà bạn đang muốn giải quyết nó . Nên mình cố gắng theo code và sửa nó.
Ở đây mình có cảm giác như là sau khi bạn yêu cầu người dùng nhập vào m (tức là số hàng = số cột ) tạo thành ma trận vuông và sau đó nếu muốn chương trình chạy được thì chuỗi "text" kiểu string nhập tiếp theo phải bằng với mxm tức bằng với số lượng phần tử trong ma trận .
Rồi sau giống như bạn đang muốn nhân 2 ma trận lại với nhau vậy , nhưng bị sai ở chỗ là chuỗi bạn yêu cầu người dùng nhập vào và sau đó ToChar thành một mảng gồm các ký tự được tách ra từ chuỗi nhập vào ,nếu như xét là 1 một ma trận thì nó chỉ có 1 dòng và text.length cột .
Biến end ở trên bạn cho là end = txt.Length => bằng 4 vì nhập chuỗi là "help" . Nhưng vòng for thứ 2 nó chạy mảng 2 chiều với m cột m hàng = 2 lúc nhập , vậy khi nó nhảy qua tới end = 2 và end = 3 thì luôn luôn mtrx = 0 .
Mình chỉ fix tạm thời và nó chạy được cách bạn nhập ma trận m=2, m=3 . Do chỉ bạn chỉ để có 1 cách nhập nên mình k test được đúng hay sai . Bạn xem thử có giúp được gì không nhé ! .Nếu chổ nào không hiểu thì cmt nha . Darky :))
Theo định nghĩa mã Hill thì khóa K là một ma trận vuông cấp m và khả nghịch trên modulo 26, hay nói rõ hơn đó là ma trận K phải có ma trận nghịch đảo trên modulo 26. Từ đó suy ra: gcd(det(K), 26) = 1 (Ước chung lớn nhất của định thức K và 26 là 1).
Bạn có thể tham khảo thêm code sau của mình, mình xây dựng dựa trên code của bạn.
Lưu ý là bạn cần phải thêm việc kiểm tra khóa K có hợp lệ hay ko và nếu bản rõ (văn bản cần mã hóa) không phải là bội của m thì bạn xử lý như thế nào?
trước viết = c .bạn thử convert sang c# thử xem
Mình không rành thuật toán. Nhưng mình có một số kinh nghiệm fix sau.
Bạn có hiểu cái mình viết k. Nếu hiểu thì thử dịch code thành tiếng việt xem code nó nói gì.
Debug tuần tự xem giá trị ra mong muốn đúng như ý k.