В Visual Studio C++ я пытаюсь умножить два числа uint64_t, хранящихся в массивах с прямым порядком байтов. К сожалению, есть две небольшие ошибки распространения переноса, которые я не могу понять, в чем проблема:
0x0306f7b285eead7d8cc88407a9f4c002 * 0xf9084d7a11528273377bf8560b3ffe =
0x2f1e00eebe083ca406e838b64ae89188195f931cca21eaaa66062c82cfffc correct
# #
0x2f1e00eebe083ca406e838b64ae88188195f931cca21faaa66062c82cfffc my code
Вот мой код:
#include // For uint64_t, uint8_t, ptrdiff_t
#include // For size_t, ptrdiff_t
#include // For memcpy, memset
#include // For printf
#include // For _umul128, _addcarry_u64
// Define uint128_t type using struct
typedef struct {
uint64_t lo;
uint64_t hi;
} uint128_t;
// Function to multiply two uint64_t numbers and get a uint128_t result
uint128_t multiply_uint64(uint64_t a, uint64_t b) {
uint128_t result;
result.lo = _umul128(a, b, &result.hi);
return result;
}
size_t len = 2;
memset(result, 0, 2 * len * sizeof(uint64_t));
for (size_t i = 0; i < len; ++i) {
uint64_t carry = 0;
for (size_t j = 0; j < len; ++j) {
// Multiply x and y[j]
uint128_t product = multiply_uint64(x, y[j]);
// Add product.lo to result[i + j] with carry
uint8_t c1 = _addcarry_u64(0, product.lo, result[i + j], &result[i + j]);
// Add carry from previous addition to result[i + j]
uint8_t c2 = _addcarry_u64(c1, result[i + j], carry, &result[i + j]);
// Update carry for next iteration
uint64_t temp_carry = product.hi + c2;
carry = temp_carry;
}
result[i + len] = carry;
}
Обновление №1, исправленный код
for (size_t i = 0; i < len; ++i) {
uint64_t carry = 0;
for (size_t j = 0; j < len; ++j) {
// Multiply x and y[j]
uint128_t product = multiply_uint64(x, y[j]);
// Add product.lo to result[i + j]
uint64_t sum1;
uint8_t c1 = _addcarry_u64(0, result[i + j], product.lo, &sum1);
// Add carry to sum1
uint64_t sum2;
uint8_t c2 = _addcarry_u64(0, sum1, carry, &sum2);
result[i + j] = sum2;
// Compute new carry
carry = product.hi + c1 + c2;
}
result[i + len] = carry;
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... nt-128-bit
Как умножить 2 массива uint64_t, представляющие 128 бит? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1737204537
Anonymous
В Visual Studio C++ я пытаюсь умножить два числа uint64_t, хранящихся в массивах с прямым порядком байтов. К сожалению, есть две небольшие ошибки распространения переноса, которые я не могу понять, в чем проблема:
0x0306f7b285eead7d8cc88407a9f4c002 * 0xf9084d7a11528273377bf8560b3ffe =
0x2f1e00eebe083ca406e838b64ae89188195f931cca21eaaa66062c82cfffc correct
# #
0x2f1e00eebe083ca406e838b64ae88188195f931cca21faaa66062c82cfffc my code
Вот мой код:
#include // For uint64_t, uint8_t, ptrdiff_t
#include // For size_t, ptrdiff_t
#include // For memcpy, memset
#include // For printf
#include // For _umul128, _addcarry_u64
// Define uint128_t type using struct
typedef struct {
uint64_t lo;
uint64_t hi;
} uint128_t;
// Function to multiply two uint64_t numbers and get a uint128_t result
uint128_t multiply_uint64(uint64_t a, uint64_t b) {
uint128_t result;
result.lo = _umul128(a, b, &result.hi);
return result;
}
size_t len = 2;
memset(result, 0, 2 * len * sizeof(uint64_t));
for (size_t i = 0; i < len; ++i) {
uint64_t carry = 0;
for (size_t j = 0; j < len; ++j) {
// Multiply x[i] and y[j]
uint128_t product = multiply_uint64(x[i], y[j]);
// Add product.lo to result[i + j] with carry
uint8_t c1 = _addcarry_u64(0, product.lo, result[i + j], &result[i + j]);
// Add carry from previous addition to result[i + j]
uint8_t c2 = _addcarry_u64(c1, result[i + j], carry, &result[i + j]);
// Update carry for next iteration
uint64_t temp_carry = product.hi + c2;
carry = temp_carry;
}
result[i + len] = carry;
}
Обновление №1, исправленный код
for (size_t i = 0; i < len; ++i) {
uint64_t carry = 0;
for (size_t j = 0; j < len; ++j) {
// Multiply x[i] and y[j]
uint128_t product = multiply_uint64(x[i], y[j]);
// Add product.lo to result[i + j]
uint64_t sum1;
uint8_t c1 = _addcarry_u64(0, result[i + j], product.lo, &sum1);
// Add carry to sum1
uint64_t sum2;
uint8_t c2 = _addcarry_u64(0, sum1, carry, &sum2);
result[i + j] = sum2;
// Compute new carry
carry = product.hi + c1 + c2;
}
result[i + len] = carry;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79365950/how-to-multiply-2-arrays-of-uint64-t-that-represent-128-bit[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия