Форум программистов, компьютерный форум, киберфорум
Fon Eberkopff
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Задача №3 по Дискретке

Запись от Fon Eberkopff размещена 10.11.2016 в 21:31
Обновил(-а) Fon Eberkopff 15.11.2016 в 11:02

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 /*****************************************************
* discr_ex3.c   10.11.2016
*
* Пусть H - подгруппа, порождённая элементом b
* в мультипликативной группе Z_p вычетов по модулю p,
* а gH - класс смежности группы Z_p по подгруппе H с представителем g.
*   a) Вычислить подгруппу H и смежный класс gH.
*   б) Каждый элемент класса gH представить в виде двоичного числа
******************************************************/
 
#include <stdio.h>  /* printf */
 
void disp_binary(int); // вывод двоичного представления числа 
 
int main()
{
    size_t exp, i;
    const int p = 79;   // вычеты по модулю p
    const int b = 18;   // элемент, порождающий подгруппу
    const int g = 11;   // представитель для смежного класса подгруппы
 
// Порядок группы равен p-1.
// Максимально возможный порядок подгруппы будет равен порядку группы.
    int subgroupH[p - 1];       // H - подгруппа, порождённая элементом b
    int coset_subgroupH[p - 1]; // смежный класс gH
    
//  Вычислить подгруппу H и смежный класс gH.
    subgroupH[0] = 1; // в цикле будем искать замыкание на первый элемент = 1
    coset_subgroupH[0] = g;
    for(exp = 1; exp < p; exp++){
        subgroupH[exp] = (subgroupH[exp-1] * b) % p;    // элементы подгруппы H
        if(subgroupH[exp] == subgroupH[0])  // проверка на замыкание элементов
            break;
        coset_subgroupH[exp] = (subgroupH[exp] * g) % p; // смежный класс gH
    }
 
// Если замыкание не найдено и превышен порядок группы, то в исходных данных ошибка
    if(exp == p - 1 && subgroupH[exp] != subgroupH[0]) {
        printf("Ошибка в исходных данных");
        return 0;
    }
 
    printf("\n H - подгруппа, порождённая элементом b = %d, ", b);
    printf("\n в мультипликативной группе Z_p вычетов по модулю p = %d, ", p);
    printf("\n а gH - класс смежности группы Z_p по подгруппе H с представителем g = %d\n", g);
    printf("\n  exp |   H   |  gH   | binary gH");
    printf("\n-----------------------\n");
    for(i = 0; i < exp; i++) {
        printf("  %2d  | %3d   | %3d   | ", i, subgroupH[i], coset_subgroupH[i]);
        disp_binary(coset_subgroupH[i]);
        printf("\n-----------------------\n");
    }
 
    printf("\n");
            
    return 0;
}
 
 
void disp_binary(int number)
{
    for(int i = 128; i > 0; i >>= 1)
        if(number & i)
            putchar('1');
        else
            putchar('0');
}
Размещено в Без категории
Просмотров 652 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.