Генератор таблиц истинности (на языке Си)
Материал из Модулярная арифметики
Код на Си
/* Генератор таблиц истинности для сумматоров по модулю */ #include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> #include <string.h> int get_bit(int x, int pos) { return (x >> pos) & 1; } int set_bit(int x, int bit_val, int pos) { if (bit_val == 1) return (x | (1 << pos)); else return (x & ~(1 << pos)); } int invert_bit(int x) { if (x == 1) return 0; else return 1; } int find_bit(int p) { int i, k; k = 1; for (i = 0; i < 32; i++) { if (k > p) return i; k *= 2; } return -1; } int pow2(int p) { return (1 << p); } void print_sum_mod(FILE *out, int p) { int i, k; int a, b; int bit, max, max2; int val, res; bit = find_bit(p-1); max = pow2(bit); max2 = pow2(2*bit); for (i = 0; i < bit; i++) fprintf(out, "A%d,", i); for (i = 0; i < bit; i++) fprintf(out, "B%d,", i); for (i = 0; i < bit; i++) fprintf(out, ",X%d", i); fprintf(out, "\n"); // Заполняем минтермы for (i = 0; i < max2; i++) { a = 0; for (k = bit-1; k >= 0; k--) { val = get_bit(i, k); a += val*pow2(k); fprintf(out, "%d,", val); } b = 0; for (k = bit-1; k >= 0; k--) { val = get_bit(i, bit + k); b += val*pow2(k); fprintf(out, "%d,", val); } res = (a + b)%p; if (a >= p || b >= p) { for (k = bit-1; k >= 0; k--) { fprintf(out, ",X"); } } else { for (k = bit-1; k >= 0; k--) { fprintf(out, ",%d", get_bit(res, k)); } } fprintf(out, "\n"); } } int main () { FILE *out; int i, num, mod; char buf[255]; for (i = 3; i < 256; i++) { sprintf(buf, "res_sum/sum_mod_%d.csv", i); out = fopen(buf, "w"); print_sum_mod(out, i); fclose(out); } return 0; }