powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вес Хэмминга: реализация и некоторые вопросы.
59 сообщений из 59, показаны все 3 страниц
Вес Хэмминга: реализация и некоторые вопросы.
    #38986435
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Речь идёт о двоичном представлении числа. Классические реализации известны

Код: plaintext
1.
2.
3.
4.
5.
6.
int popcount(long long x) {
    int res;
    for (res=0; x; res++)
        x &= x-1;
    return res;
}



или реализации основанные на принципе "разделяй и властвуй" описанные, например, в книге Генри Уоррена "Алгоритмические трюки для программиста"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int popcount2(int x)
{
	x = x - ((x >> 1) & 0x55555555);
	x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
	x = (x + (x >> 4)) & 0x0F0F0F0F;
	x = x + (x >> 8);
	x = x + (x >> 16);
	x = x & 0x0000003F;
	return x;
}


и т.д.


Прочитал что существуют методы в Си и С++ аналогичного назначения. И если объект bitset и метод count() я нашёл в стандарте С++, то функции __builtin_popcount в стандарте языка Си нет. Хотя может быть не в той документации искал. Пользовались ли вы такими функциями и правильно ли я понимаю, их вызов требует меньшего времени по сравнению с классическими реализациями показанными выше ?

Интересно, существовали ли раньше методы шифрования использующие данную характеристику ?
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38986480
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно таблицами быстрее будет

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    char table[256] = { ... };
    uint32_t popcount2(uint32_t i)
    {
        union{
            uint32_t i;
            char c[4];
        }x;

        x.i = i;

        uint32_t res;

        res = table[ x.c[0] ];
        res += table[ x.c[1] ];
        res += table[ x.c[2] ];
        res += table[ x.c[3] ];

        return res;
    }


...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38986491
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__builtin_popcount - это "встроенная функция" для GCC только под х86, генерирует соответствующую машинную команду popcnt . Непереносимо на другие архитектуры/компиляторы, есть аналог для msvc
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38986888
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из набора SSE4 есть такая штука.

Тут можно найти описание POPCNT.
https://software.intel.com/sites/default/files/c8/ab/17971-intel_20sse4_20programming_20reference.pdf
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38987402
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! Скоро протестирую.

Прошу прощение, уже 10 минут не могу понять почему строка выделенная желтым не работает корректно(отправляет на поток 0 к значению веса Хемминга). Подскажите пожалуйста в чём ошибка. Хотя скорее всего это не ошибка, а нормальная работа, и я что-то забыл

Код: plaintext
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.
int get_HW(long long x)
{
	int r = 0;
	while (x){
		x &= x - 1;
		++r;
	}
	return r;
}

long long test(long long x, FILE* out)
{
	for (int i = 0; i < 1<<7; ++i){
		fprintf(out, "i = %3i x = %3i HW = %3i\n", i, x, get_HW(x));
		x = x + get_HW(x);
	}
	return x;
}

int main()
{
	FILE* out = fopen("output.txt", "w");

	test(1,stdout);
	fclose(out);
	return 0;
}



Если поменять местами get_HW(x) и x то всё ок
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38987404
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, long long x затирает память под get_HW(). Прошу прощение
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38987426
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати. Почему данную характеристику иначе называют "population count" ?
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38987431
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Видимо, сколько битиков живут в слове.

Что за формат такой %i ?
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38987434
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Для x формат должен быть %ll
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38987446
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSashaMercury,

Видимо, сколько битиков живут в слове.

Что за формат такой %i ?

ну может быть :)
с форматом разобрался, спасибо :)
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38987865
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЧто за формат такой %i ?

Отвечу сам себе, посмотрев в документации:
%i - полный аналог %d.
Я этого не знал, всю жизнь использовал %d и не жужжал.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38987977
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivMasterZivЧто за формат такой %i ?

Отвечу сам себе, посмотрев в документации:
%i - полный аналог %d.
Я этого не знал, всю жизнь использовал %d и не жужжал.

я подумал что это был риторический вопрос в контексте "что за i если должно быть lli" :)
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38989336
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
На прошлой неделе стал решать такую задачу .
Вообще говоря, требуется найти m элемент такой последовательности . Приводится слабая оценка . Например при m= это приближение даёт 5120, а должно быть 5981.
В целом, я представляю как решить эту задачу. Но данное решение требует предварительные вычисления(объём которых больше, чем мне хочется) и не кажется мне хорошим/красивым/правильным(с точки зрения как реализации, так и алгоритма). Может быть у кого-нибудь есть идеи как лучше подступиться к решению данной задачи?
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38989352
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вычисление 100000000 значений у меня занимает 0,7сек
весь диапазон 2*10^9 делим на 20 частей и заранее вычисляем 20 значений ключа
не очень красиво, но тест пройдет
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38989355
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slaвычисление 100000000 значений у меня занимает 0,7сек
весь диапазон 2*10^9 делим на 20 частей и заранее вычисляем 20 значений ключа
не очень красиво, но тест пройдет

Если делить по 100 000 000 то потребуется порядка 300 участков. Собственно это и пришло в голову. Кроме того, возникнут нюансу связанные с тем, что первое число не всегда 1. Они конечно решаются, но слишком много предварительных вычислений в итоге.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38989360
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не подойдет вариант
первое число может быть 4, его вообще в последовательности нет
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38989362
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slaне подойдет вариант
первое число может быть 4, его вообще в последовательности нет

это все решается. Хранятся промежуточные массивы которые принадлежат всем возможным последовательностям, т.е. каждый слой шириной 10^8 элементов хранится массив из 30 элементов с некоторыми характеристиками. Например так. Остальной ерунда, и дело техники. Но это очень некрасивый способ, и мне очень не хочется его использовать. Наверняка должно быть хорошее решение.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990245
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, __popcnt64 не работает в MVS Express 2013. Возможно из-за версии express, т.к.__popcnt и popcnt16 работают.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990255
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, __popcnt64 не работает на 32х битной платформе, только в х64. Не знаю как 2013, но раньше Express действительно не поддерживал компиляцию под 64 бита.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990256
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вычислить значение ключа через 2 000 000 000 минут
на С (mingw) считает за 20,2 сек
на asm считает 4,2 сек
Код: plaintext
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.
68.
69.
	; fasm 1.71.39

	format PE console
	include 'win32axp.inc'

	.data

	format_string  db 'key(HEX) = %04X%04X',9,'%d.%d sek',0
	output_string  db 256 dup ( 0 )

	SystemTimeBegin SYSTEMTIME
	SystemTimeEnd	SYSTEMTIME
	FileTimeBegin	dd 0, 0
	FileTimeEnd	dd 0, 0

	key dd 0, 0

	.code
start:

	; Для расчета быстродействия запрашиваем системное время начала цикла
	invoke GetSystemTime, SystemTimeBegin

	; расчет ключа 64 бита
	;   начальное значение 1
	;   вычислить значение ключа через 2000000000 минут
	mov edi, 2000000000
	xor ecx, ecx
	mov ebx, 1
 @@:
	; key = key + popcount(key)
	; ebx - младшие 32 бита key
	; eсx - старшие 32 бита key

	; popcount 64 бита
	popcnt eax, ebx
	popcnt edx, ecx
	add eax, edx

	; key + popcount(key)
	add ebx, eax
	adc ecx, 0

	dec edi
	jnz @b
	mov [key], ebx
	mov [key + 4], ecx

	; Для расчета быстродействия запрашиваем системное время окончания цикла
	invoke GetSystemTime, SystemTimeEnd

	; для удобства расчета переводим SYSTEMTIME в FILETIME
	invoke SystemTimeToFileTime, SystemTimeBegin, FileTimeBegin
	invoke SystemTimeToFileTime, SystemTimeEnd, FileTimeEnd
	; TimeEnd - TimeBegin
	; eax - секунды
	; edx - миллисек
	mov eax, [FileTimeEnd]
	mov edx, [FileTimeEnd + 4]
	sub eax, [FileTimeBegin]
	sbb edx, [FileTimeBegin + 4]
	mov ebx, 10000000
	div ebx

	cinvoke wsprintfA, output_string, format_string, [key + 4], [key], eax, edx
	invoke MessageBoxA, 0, output_string, 'Test', MB_OK

	invoke ExitProcess,0
	.end start

...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990264
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

IDE такой функции не знает. У меня 64 битная платформа.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990266
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla,

а нужно за секунду :)
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990269
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSm_Sla,

а нужно за секунду :) хотя наверняка можно быстрее
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990271
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
popcount2() из первого поста быстро работает
Код: plaintext
1.
2.
3.
4.
5.
	long long x = 1;
	while(x < 2000000000) {
		x += popcount2(x);
	}
	printf("x=%llu  time: %d ms\n", x, clock());



результатx=2000000010 time: 620 ms
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990272
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант m_Sla с таблицей 17785880 немного быстрее
тест popcount3()x=2000000010 time: 460 ms
popcount3()
Код: plaintext
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.
int popcount3(int x)
{
	static int table[256] ={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,
							2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
							2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,
							4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
							2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,
							3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
							4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};
    union{
        unsigned int i;
        unsigned char c[4];
    }u;

    u.i = x;

    int res;

    res = table[ u.c[0] ];
    res += table[ u.c[1] ];
    res += table[ u.c[2] ];
    res += table[ u.c[3] ];

    return res;

}

...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990276
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, у тебя цикл неправильный

у правильного в конце х = 34179892637
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990277
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это хорошо. Но даже если мы будем складывать 10^9 единиц в цикле, нам не хватит одной секунды
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990285
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryBarlone,

IDE такой функции не знает. У меня 64 битная платформа.не сильно большая проблема
__popcnt64 = __popcnt32 + __popcnt32
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990286
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_SlaSashaMercuryBarlone,

IDE такой функции не знает. У меня 64 битная платформа.не сильно большая проблема
__popcnt64 = __popcnt32 + __popcnt32

а аргумент у функций правой части какой ?)
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990287
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_SlaDima T, у тебя цикл неправильный

у правильного в конце х = 34179892637
Неправильно условия почитал, думал результат не более 2*10^9

Поправил цикл
Код: plaintext
1.
2.
3.
4.
	long long x = 1;
	for(int i = 0; i < 2000000000; i++) {
		x += popcount3(x);
	}


Результатx=34179892637 time: 9053 ms
В норматив по времени не укладывается :(

popcount3(long long x)
Код: plaintext
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.
int popcount3(long long x)
{
	static int table[256] ={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,
							2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
							2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,
							4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
							2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,
							3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
							4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};

    union{
        unsigned long long i;
        unsigned char c[8];
    }u;

    u.i = x;

    int res;

    return table[ u.c[0] ]
		+ table[ u.c[1] ]
		+ table[ u.c[2] ]
		+ table[ u.c[3] ]
		+ table[ u.c[4] ]
		+ table[ u.c[5] ]
		+ table[ u.c[6] ]
		+ table[ u.c[7] ];

    return res;

}

...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990292
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurym_Slaпропущено...
не сильно большая проблема
__popcnt64 = __popcnt32 + __popcnt32

а аргумент у функций правой части какой ?)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
union MY_LARGE_INTEGER
{
    struct
    {
        uint32_t uint32_low;
        uint32_t uint32_high;
    };
    uint64_t uint64;
};

MY_LARGE_INTEGER x;
    x.uint64 = 1;
    popcount32( x.uint32_high ) + popcount32( x.uint32_low )
    

...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990296
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХУ невозможно за секунду посчитать 2 млрд. итераций: частота самого быстрого проца 4 ГГц, считаем что за один такт выполняется 1 команда, получается надо чтобы одна итерация была не более 2 команд.

Надо либо параллелить (хз как), либо искать алгоритм который посчитает без перебора.

Саша, зашли на проверку вариант с таблицей, может проскочит :)
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990307
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИМХУ невозможно за секунду посчитать 2 млрд. итераций: частота самого быстрого проца 4 ГГц, считаем что за один такт выполняется 1 команда, получается надо чтобы одна итерация была не более 2 команд.

Надо либо параллелить (хз как), либо искать алгоритм который посчитает без перебора.

Саша, зашли на проверку вариант с таблицей, может проскочит :)Соглашусь.
Или есть некая закономерность в ряду или использовать заранее просчитанные значения.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990312
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно этот теоретический порог можно поднять если заюзать архитектуру с MCMA .
Но стоит ли так сильно оптимизировать? Кто в состоянии так быстро инициализировать такой объем?
Не получим-ли мы очередной "Стебелёк" который внутри себя демострируют потрясающие индексы
перформанса хотя практически непонятно как их с пользой применить.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990329
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИМХУ невозможно за секунду посчитать 2 млрд. итераций: частота самого быстрого проца 4 ГГц, считаем что за один такт выполняется 1 команда, получается надо чтобы одна итерация была не более 2 команд.

Надо либо параллелить (хз как), либо искать алгоритм который посчитает без перебора.

Саша, зашли на проверку вариант с таблицей, может проскочит :)

Может быть. Сейчас попробую
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990340
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, на 13 тесте Time limit exceeded
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990347
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДмитрий, на 13 тесте Time limit exceeded
Значит надо изобретать алгоритм без перебора. Искать какие-то зависимости у этой последовательности.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990411
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
закономерность есть, похоже ряды от произвольных чисел вливаются в ряд от 1
ряд от 1

1, 2, 3, 5, 7, 10, 12, 14, 17, 19, 22, 25, 28, 31, 36, 38, 41, 44, 47, 52, 55, 60, 64, 65, 67, 70, 73, 76, 79, 84, 87, 92, 96, 98, 101, 105, 109, 114, 118, 123, 129, 131, 134, 137, 140, 143, 148, 151, 156, 160, 162, 165, 169, 173, 178, 182, 187, 193, 196, 199, 204

begin time key(time)
1 2000000000 34179892637
2 2000000000 34179892659
3 2000000000 34179892681
4 2000000000 34179892681
5 2000000000 34179892702
6 2000000000 34179892702
7 2000000000 34179892725
8 2000000000 34179892725
9 2000000000 34179892748
10 2000000000 34179892748
11 2000000000 34179892767
12 2000000000 34179892767
13 2000000000 34179892767
14 2000000000 34179892789
15 2000000000 34179892810
16 2000000000 34179892789
17 2000000000 34179892810
18 2000000000 34179892810
19 2000000000 34179892830

begin time key(time)
100 2000000000 34179893341
101 2000000000 34179893362
102 2000000000 34179893362
103 2000000000 34179893362
104 2000000000 34179893362
105 2000000000 34179893382
106 2000000000 34179893382
107 2000000000 34179893382
108 2000000000 34179893382
109 2000000000 34179893401
110 2000000000 34179893401
111 2000000000 34179893442
112 2000000000 34179893401
113 2000000000 34179893442
114 2000000000 34179893421
115 2000000000 34179893421
116 2000000000 34179893421
117 2000000000 34179893461
118 2000000000 34179893442
119 2000000000 34179893461
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990452
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slaзакономерность есть, похоже ряды от произвольных чисел вливаются в ряд от 1
опередил :)

я тоже самое заметил
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	long long x;

	for(long long k = 1; k < 100000; k++) {
		x = k;
		while(x < 100000) {
			x += popcount3(x);
		}
		printf("k=%llu  x=%llu  time: %d ms\n", k, x, clock());
		if(x != 100009) break;
	}


результат...
k=99799 x=100009 time: 6469 ms
k=99800 x=100007 time: 6469 ms

Дальше таблицу контрольных точек и по выходу на точку расчет по таблице.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38990625
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с заранее рассчитанными значениями считает за 0,6-0,7 сек
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991197
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы говорите, что начиная с какого-то шага h любая последовательность (n,k) будет совпадать с последовательностью (1, k+m). Всегда ли это будет так ? Я не был уверен, потому предлагал хранить слой точек через интервалы. Но допустим так. Допустимый интервал решений от 2 до 20*10^9. Пусть контрольные точки будут расположены каждые 10^8. Т.е. потребуется хранить 200 точек a[i],i=0..199. Пусть n находится в интервале (a[i],a[i+1]). Можно ли быть уверенным что (n,k) будет пересекаться с (1, k+m) в точке a[i+1]. Не обязательно. А с a[i+2] ? Тоже не обязательно. А с a[i+3] ?
Метод с использованием слоёв более трудоёмок с точки зрения предварительных вычислений, но зато обоснован. Этот метод не представляется таким, тем не менее попробую его реализовать
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991211
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Число точек я завысил конечно. Программу написал, пока аналогично TLE. Сейчас ещё раз протестирую и выложу. Кстати, странно, но в этой функции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void get_auxilary_data(FILE* out)
{
	long long x = 1;
	for (long long i = 1; i <= 20000000000; i+=100000000){ //20*1000000000
		x = do_set_cycles(x, 100000000, out);
		fprintf(out, "%lli\n", x);
	}
}



20000000000 нужно писать именно так, если я пишу 20*1000000000 то цикл не выполняется. Видимо переполнение. Позже разберусь, пока нужно понять почему TLE и сейчас.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991214
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
засчитали задачу
быстродействие на грани фола
первый раз отправил 1,184 сек - не приняли
второй раз (ни чего не менял) 0,858 - приняли :)
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991215
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla, шаг сетки 10^8 ^
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991216
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slaзасчитали задачу
быстродействие на грани фола
первый раз отправил 1,184 сек - не приняли
второй раз (ни чего не менял) 0,858 - приняли :)

поздравляю C:
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991219
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде сдал, пять минут
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991222
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla, тоже сдал, но с шагом 5*10^7
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991224
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
#include <fstream>

using namespace std;

ifstream cin("input.txt");
ofstream cout("output.txt");

long long p(long long x)
{
	static int t[256] ={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,
							2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
							2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,
							4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
							2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,
							3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
							4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};

    union{
        unsigned long long i;
        unsigned char c[8];
    }u;

    u.i = x;

    return t[ u.c[0] ]
		+ t[ u.c[1] ]
		+ t[ u.c[2] ]
		+ t[ u.c[3] ]
		+ t[ u.c[4] ]
		+ t[ u.c[5] ]
		+ t[ u.c[6] ]
		+ t[ u.c[7] ];
}

long long k[] = {     1, 708317451, 1469980682, 2262110904, 3043866212, 3862449390, 4668805409, 5470537697,
                        6304910373, 7130085732, 7993963848, 8843341559, 9642632564, 10462457837, 11294354943, 12147801091,
                        13027785740, 13866220876, 14738125641, 15620496693, 16528261375, 17414010602, 18210846386, 19030163466,
                        19866094009, 20716233325, 21598491427, 22434485955, 23305273534, 24189801396, 25096174497, 26001121902,
                        26851772374, 27723118090, 28602397046, 29520182534, 30427698867, 31328121968, 32270214646, 33203913310,
                        34179892637, 34987847882, 35795799216, 999999999999
                  };

int main()
{
    long long v, t;

    cin >> v >> t;

    int i = 0;
    while(v >= k[i+1])
    {
        i++;
    }

    while( t )
    {
        if(v==k[i] ) break;
        if(v==k[i+1]) { i++; break; }

        v += p(v);
        t--;
    }

    while( t >= 50000000)
    {
        i++;
        v = k[i];
        t -= 50000000;
    }

    while(t)
    {
        v += p(v);
        t--;
    }

    cout << v;

    return 0;
}

...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991226
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
#include <stdio.h>
#include <stdlib.h>

#define STEP  50000000

long long a[201] = {1, 708317451, 1469980682, 2262110904, 3043866212, 3862449390, 4668805409, 5470537697, 6304910373, 7130085732, 7993963848, 8843341559, 9642632564, 10462457837, 
11294354943, 12147801091, 13027785740, 13866220876, 14738125641, 15620496693, 16528261375, 17414010602, 18210846386, 19030163466, 19866094009, 20716233325, 21598491427, 22434485955,
23305273534, 24189801396, 25096174497, 26001121902, 26851772374, 27723118090, 28602397046, 29520182534, 30427698867, 31328121968, 32270214646, 33203913310, 34179892637, 34987847882,
35795799216, 36638581537, 37474898933, 38346063129, 39197471652};


int popcount(long long x)
{
	static int table[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4,
		2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
		2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6,
		4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
		2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5,
		3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
		4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 };

	union{
		unsigned long long i;
		unsigned char c[8];
	}u;

	u.i = x;

	int res;

	return table[u.c[0]]
		+ table[u.c[1]]
		+ table[u.c[2]]
		+ table[u.c[3]]
		+ table[u.c[4]]
		+ table[u.c[5]]
		+ table[u.c[6]]
		+ table[u.c[7]];

	return res;

}


long long do_set_cycles(long long x, long long count, FILE* out)
{
	for (long long i = 0; i < count; ++i){
		x = x + popcount(x);
	}
	return x;
}


int main()
{
	FILE* in = fopen("input.txt", "r");
	long long n,k;
	fscanf(in, "%I64d %I64d", &n, &k);
	fclose(in);
	//MAIN ALGORITHM
	FILE* out = fopen("output.txt", "w");
	long long res = n;                    
	if (k > STEP)
	{
		int i = 0;
		while (res != a[i]){
			k -= 1;
			res = res + popcount(res);
			if (res > a[i]) i += 1;
		}	
		int shift = k / STEP;
		res = a[i + shift];
		k -= shift*STEP;

	}
	res = do_set_cycles(res, k, out);
	fprintf(out, "%I64d\n", res);
	fclose(out);
	return 0; 
}

...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991227
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только заметил что popcount не совсем корректно написана. Исправил.

Код: plaintext
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.
#include <stdio.h>

#define STEP  50000000

long long a[201] = {1, 708317451, 1469980682, 2262110904, 3043866212, 3862449390, 4668805409, 5470537697, 6304910373, 7130085732, 7993963848, 8843341559, 9642632564, 10462457837, 
11294354943, 12147801091, 13027785740, 13866220876, 14738125641, 15620496693, 16528261375, 17414010602, 18210846386, 19030163466, 19866094009, 20716233325, 21598491427, 22434485955,
23305273534, 24189801396, 25096174497, 26001121902, 26851772374, 27723118090, 28602397046, 29520182534, 30427698867, 31328121968, 32270214646, 33203913310, 34179892637, 34987847882,
35795799216, 36638581537, 37474898933, 38346063129, 39197471652};


int popcount(long long x)
{
	static int t[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4,
		2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
		2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6,
		4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
		2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5,
		3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
		4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 };

	union{
		unsigned long long i;
		unsigned char c[8];
	}u;

	u.i = x;
	return t[u.c[0]] + t[u.c[1]] + t[u.c[2]] + t[u.c[3]] + t[u.c[4]] + t[u.c[5]] + t[u.c[6]] + t[u.c[7]];
}


long long do_set_cycles(long long x, long long count, FILE* out)
{
	for (long long i = 0; i < count; ++i){
		x = x + popcount(x);
	}
	return x;
}


int main()
{
	FILE* in = fopen("input.txt", "r");
	long long n,k;
	fscanf(in, "%I64d %I64d", &n, &k);
	fclose(in);
	//MAIN ALGORITHM
	FILE* out = fopen("output.txt", "w");
	long long res = n;                    
	if (k > STEP)
	{
		int i = 0;
		while (res != a[i]){
			k -= 1;
			res = res + popcount(res);
			if (res > a[i]) i += 1;
		}	
		int shift = k / STEP;
		res = a[i + shift];
		k -= shift*STEP;

	}
	res = do_set_cycles(res, k, out);
	fprintf(out, "%I64d\n", res);
	fclose(out);
	return 0; 
}

...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991253
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для mingw переписал popcount
использует процессорную команду popcnt

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
uint64_t popcount2(uint64_t x)
{
    uint32_t result;

    union {
        uint64_t a;
        uint32_t b[2];
    } a;
    a.a = x;

    asm ("popcnt  %%ebx, %%eax;"
         "popcnt  %%edx, %%ecx;"
         "addl %%ecx, %%eax;"
         :"=a" (result)
         :"b"(a.b[0]), "d" (a.b[1])
         :"ecx");

    return result;
}


на acmp.ru процессор неправильный, команду popcnt не понимает
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991312
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу, у меня также. Я вчера пробовал использовать эту функцию на том ресурсе.
Несмотря на то, что формально мы сдали задачу, я не уверен что оно правильное. Мы не можем предсказать сколько времени будет выполняться данный цикл

Код: plaintext
1.
2.
3.
4.
5.
6.
                int i = 0;
		while (res != a[i]){
			k -= 1;
			res = res + popcount(res);
			if (res > a[i]) i += 1;
		}	
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991349
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМы не можем предсказать сколько времени будет выполняться данный цикл
Можно взять генератор случайных чисел и запустить поиск максимума.

Думаю максимум будет примерно STEP + 1-3%.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38991489
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
k -= 1;


Прикольнулся?
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38992168
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: plaintext
1.
k -= 1;


Прикольнулся?

Почему ?) Такая запись кажется мне более красивой, нежели
Код: plaintext
1.
k--;



Но если бы я знал наверняка, что второй вариант быстрее, то использовал бы только его.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38992169
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно. Задачу мы сдали довольно легко (путь даже не так как я хотел). И сложность у этой задачи самая большая на том ресурсе. Помню мы как-то решали эту задачу . Тут мы её обсуждали .Сложность у неё в полтора раза меньше (судя по процентам на том сайте), но решение намного сложнее.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38992335
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, на самом деле я тоже не знаю во что конкретный компиллятор собирает
выражение

Код: plaintext
1.
k-=1;



Но оно очень похоже на присвоение. Сторонний дев который не знает С++ при реверсе
кода может решить что это хитрое присвоение минус 1. Или хитрая проверка.

Недавно на Groovy/DSL семинарах мы рассмотрели такое выражение.
Код: plaintext
1.
2.
3.
while( x --> 0){
   // do smth
}



Разработчики, незнающие С++/Java/Groovy делали для себя вывод что это
цикл "пока икс стремится к нулю". Вобщем эдакий себе софизм.
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38993196
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В нашем городе нет семинаров по Си и программированию вообще (к сожалению), но рассмотренный пример для любого программиста (даже для меня) разве не тривиальный ?
PS
Марк, взял бы и выложил задачи что вы там разбирали в отдельном топике ;)
...
Рейтинг: 0 / 0
Вес Хэмминга: реализация и некоторые вопросы.
    #38993240
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это было не в тему С++.
...
Рейтинг: 0 / 0
59 сообщений из 59, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вес Хэмминга: реализация и некоторые вопросы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]