[アルゴリズム] 最適な符号化 – 暗号化方式シャノン

コンテンツ
シャノン暗号
コー​​ドアルゴリズム

この記事では、今述べたシャノンと暗号化方式コードC / C ++のアルゴリズム. あなたが知っているすべての概念に関連するデフォルト, そうでない場合は、あなたが兄のGoogle NHE呼び出し明確なコンセプト. ^^

シャノン暗号

確率分布表とソースUを考えます

における1 における2 におけるN
P1 P2 PN

ステップ 1: 確率の降順でソート項目
ステップ 2: メッセージの暗号化コードUの長さを計算します 式:
2^{-n_{i}} \leq P(U_{i}) \leq 2^{1-n_{i}}
この式から、我々は、式が簡単である変更します:
n_{i} = \left [ -log_{2}P(U_{i}) \right ]
ステップ 3: 計算されたF(における) 式:
\begin{cases}  F(U_{i}) = \sum_{j=0}^{i-1}P(U_{i}) = P(U_{i-1}) + F(U_{i-1}) & \text{ khi } i \geqslant 2 \\  F(U_{i}) = 0 & \text{ khi } i = 1  \end{cases}
ステップ 4: フォワードF(における) ステップから 3 バイナリへ
ステップ 5: Nを取ります Fの次の文字は、小数の計算(における) これは、Uのコードです

例: 文字列の電源と nguyenvanquan7826. 上記の手順を実行した後、以下の結果を持っています:

暗号化シャノン

これらは、以下のプログラムを実行した結果であります. プログラムでは、, Pを計算し、n個の分画を計算するとき、Fは、右の小数点形まで変化しませんが より正確な結果を10進数に新しいスイッチ.

コー​​ドアルゴリズム

//============================================================================
// Name        : Shanon.cpp
// Author      : nguyenvanquan7826
//============================================================================

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

typedef struct {
	char s1;
	int ni, P, F, b[100];

} nguon;
void doicho(nguon *a, nguon *b) {
	nguon c;
	c = *a;
	*a = *b;
	*b = c;
}

int main() {
	char *s;
	nguon *kitu;
	int i, j, n, k = 1, *a, ni, maxni;

	s = (char *) malloc(100 * sizeof(char));
	a = (int *) malloc(100 * sizeof(int));
	kitu = (nguon *) malloc(100 * sizeof(nguon));

	printf("Moi ban nhap day nguon: ");
	gets(s);
	fflush(stdin);
	puts(s);
	n = strlen(s);

	//Phan loai ki tu va tinh P(Ui)
	for (j = 1; j <= 256; j++) {
		a[k] = 0;
		for (i = 0; i <= n; i++)
			if ((int) s[i] == j) {
				a[k]++;
				kitu[k].s1 = s[i];
			}
		if (a[k] > 0) {
			kitu[k].P = a[k];
			k++;
		}
	}
	for (i = 1; i < k; i++)
		for (j = i; j < k; j++)
			if (kitu[i].P < kitu[j].P)
				doicho(&kitu[i], &kitu[j]);

	//Tinh F(Ui)

	for (i = 1; i <= k; i++) {
		if (i == 1)
			kitu[1].F = 0;
		if (i > 1)
			kitu[i].F = kitu[i - 1].F + kitu[i - 1].P;
	}

	//Tinh ni
	for (i = 1; i < k; i++) {
		float j;
		j = n / kitu[i].P;
		ni = (int) (log(j) / log(2)) + 1;
		kitu[i].ni = ni;
	}
	maxni = kitu[1].ni;
	for (i = 1; i < k; i++)
		if (kitu[i].ni > maxni)
			maxni = kitu[i].ni;

	//Tinh F(Ui) he 2
	int l;
	float F;
	for (i = 1; i < k; i++) {
		l = 1;
		F = (float) kitu[i].F / n;
		while ((l <= maxni) && (F != 0)) {
			F = F * 2;
			kitu[i].b[l] = (int) F / 1;
			l++;
			F = F - (int) F;
		}
	}

	printf("\n\n%5s %10s %10s %7s", "Ui", "P(Ui)", "F(Ui)", "ni");
	for (i = 1; i <= maxni + 1; i++)
		printf(" ");
	printf("%9s", "F(Ui)2");
	for (i = 1; i <= maxni; i++)
		printf(" ");
	printf("%10s", "Ma");
	for (i = 1; i < k; i++) {
		ni = kitu[i].ni;
		printf("\n%5c %7d/%d %7d/%d %7d", kitu[i].s1, kitu[i].P, n, kitu[i].F,
				n, kitu[i].ni);
		for (j = 1; j <= maxni - ni; j++)
			printf(" ");
		printf("%10s", "0.");
		for (j = 1; j <= ni; j++)
			printf("%d", kitu[i].b[j]);
		for (j = 1; j <= maxni - ni; j++)
			printf(" ");
		printf("%10s", " ");
		for (j = 1; j <= ni; j++)
			printf("%d", kitu[i].b[j]);
	}
	printf("\n");
	return 0;
}