Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Реализация алгоритма Эль-Гамаля или Рабина


Автор: DrAcu1A 14.5.2008, 16:39
Пожалуйста помогите написать прогу для реализации алгоритма Эль-Гамаля или Алгоритма Рабина, желательно не очень мудрёную, чтоб в ней можно было разобраться

Автор: Sartorius 14.5.2008, 17:17
Код

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

#define MAX_SUBSTR_LEN 10

long powerTable[MAX_SUBSTR_LEN] = {0};

void initPowerTable()
{
    for (int i = 0; i < MAX_SUBSTR_LEN; i++)
    {
        powerTable[i] = pow('z', i);
    }
}

long int hash(const char * str, unsigned int str_len)
{
    long result = 0;

    for (int i = 0; i < str_len; i++)
    {
        result += str[i] * powerTable[i];
    }

    return result;
}

int RabinKarp(const char * str, const char * substr)
{
    int i, j;

    long subh = hash(substr, strlen(substr));
    long sh = hash(str, strlen(substr));

    for (i = 0; i < strlen(str) - strlen(substr); i++)
    {
        if(subh == sh)
        {
            return i;
        }
        // calculate new hash
        sh /= 'z';
        sh += powerTable[strlen(substr) - 1] * str[i + strlen(substr) ];
    }

    return -1;
}

void main()
{
    initPowerTable();
    printf("%d", RabinKarp("AA    BLA AAA", "BLA"));
}


Уберите только эти бесконечные вызовы strlen() smile)  Ну и для слишком длинных подстрок, когда хэш становится вырожденным добавьте проверку strncmp() еще

Автор: DrAcu1A 14.5.2008, 17:28
Спаисибо Огромное =)

Автор: Sartorius 14.5.2008, 17:32
 Хм. то что я написал из за переполнения ошибается на длинных подстроках
Здесь можно найти пример с другим хэшем:
http://algolist.manual.ru/search/esearch/karp_rab.php

Автор: DrAcu1A 14.5.2008, 18:30
хмм...прога запускаеться, но в ней что то не так, после запуска она сразу же выкидывает, а при нажатии Alt+F5 там просто стоит цифра 6

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)