172 похожих чатов

Господа, я тут решил реализовать алгоритм Диффи-Хеллмана. А для него

нужна длинная арфметика. Не подскажете ли, где её взять?

26 ответов

16 просмотров

Вроде был крейт

ныа, держи: use std::ops::{Add, Mul}; #[derive(Debug, Clone)] struct BigInteger { data: Vec<u32>, } impl BigInteger { fn new(value: u64) -> Self { let mut data = Vec::new(); let mut v = value; while v > 0 { data.push((v % 10_000) as u32); // Store in chunks of 10,000 for simplicity v /= 10_000; } BigInteger { data } } } // Addition for BigInteger impl Add for BigInteger { type Output = Self; fn add(self, other: Self) -> Self { let mut result = BigInteger { data: Vec::new() }; let mut carry = 0; for i in 0..std::cmp::max(self.data.len(), other.data.len()) { let sum = carry + self.data.get(i).cloned().unwrap_or(0) + other.data.get(i).cloned().unwrap_or(0); result.data.push(sum % 10_000); carry = sum / 10_000; } if carry > 0 { result.data.push(carry); } result } } // Multiplication for BigInteger impl Mul for BigInteger { type Output = Self; fn mul(self, other: Self) -> Self { let mut result = BigInteger { data: vec![0] }; for (i, &digit_self) in self.data.iter().enumerate() { let mut carry = 0; for (j, &digit_other) in other.data.iter().enumerate() { let product = result.data[i + j] + digit_self * digit_other + carry; result.data[i + j] = product % 10_000; carry = product / 10_000; } if carry > 0 { result.data.push(carry); } } result } } fn main() { let num1 = BigInteger::new(12345678901234567890); let num2 = BigInteger::new(98765432109876543210); let sum = num1.clone() + num2.clone(); let product = num1 * num2; println!("Num1: {:?}", num1); println!("Num2: {:?}", num2); println!("Sum: {:?}", sum); println!("Product: {:?}", product); }

Alexander "SonnySlave" Zaitsev
ныа, держи: use std::ops::{Add, Mul}; #[derive(De...

Если что-то не работает в нём, все претензии к нему

Прям-таки длинная? ПОтому что есть U256/U512, а если их недостаточно можно форкнуть либу и добавить U нужного размера

Alexander "SonnySlave" Zaitsev
ныа, держи: use std::ops::{Add, Mul}; #[derive(De...

Выглядит как-то не очень производительно и экономно

Alexander "SonnySlave" Zaitsev
screenshot есть и другой вариант

Ты не получишь от нейронки нормальный вариант

Alexander "SonnySlave" Zaitsev
Это ты просто на стадии отрицания

нет. я просто знаю что молотком плохо закручивать гайки

Αλεχ Zhukovsky
нет. я просто знаю что молотком плохо закручивать ...

это всё отговорки, чтобы Copilot хлеб не отобрал в том числе и у ржавых

Twin Terrors
Ну скинь нормальный ответ

use std::ops::{Add, Mul}; #[derive(Debug, Clone)] struct BigInteger { data: Vec<u32>, } impl BigInteger { fn new(value: u64) -> Self { let mut data = vec![(value % 10_000) as u32]; let mut v = value / 10_000; while v > 0 { data.push((v % 10_000) as u32); v /= 10_000; } BigInteger { data } } } // Addition for BigInteger impl Add for BigInteger { type Output = Self; fn add(self, other: Self) -> Self { let (mut result, mut carry) = (BigInteger { data: Vec::new() }, 0); for (a, b) in self.data.iter().zip_longest(other.data.iter()) { let sum = a.cloned().unwrap_or(0) + b.cloned().unwrap_or(0) + carry; result.data.push(sum % 10_000); carry = sum / 10_000; } if carry > 0 { result.data.push(carry); } result } } // Multiplication for BigInteger impl Mul for BigInteger { type Output = Self; fn mul(self, other: Self) -> Self { let mut result = vec![0; self.data.len() + other.data.len()]; for (i, &digit_self) in self.data.iter().enumerate() { let mut carry = 0; for (j, &digit_other) in other.data.iter().enumerate() { let product = result[i + j] + digit_self * digit_other + carry; result[i + j] = product % 10_000; carry = product / 10_000; } if carry > 0 { result[i + other.data.len()] += carry; } } while let Some(&0) = result.last() { result.pop(); } BigInteger { data: result } } } Держи - это safe и blazing fast реализация длинки

Alexander "SonnySlave" Zaitsev
screenshot с тобой не согласны

тебе варн за спам/флейм крч

Αλεχ Zhukovsky
тебе варн за спам/флейм крч

а ты так и не дал аргумента, чем эта реализация "мусор" (как резонно коллега на скрине выше заметил)

Alexander "SonnySlave" Zaitsev
а ты так и не дал аргумента, чем эта реализация "м...

Начнем с того что хранить чанки по 10к вместо u32::MAX это вот сразу кринж

Alexander "SonnySlave" Zaitsev
use std::ops::{Add, Mul}; #[derive(Debug, Clone)]...

почему в реализации суммы используются деления

Αλεχ Zhukovsky
Начнем с того что хранить чанки по 10к вместо u32:...

ну это имело бы смысл, если умножать через FFT

Mikail Bagishov
ну это имело бы смысл, если умножать через FFT

Но согласен, при при тупом умножении за квадрат как тут выходит кринж

Mikail Bagishov
ну это имело бы смысл, если умножать через FFT

Не думаю, что в fft требуется кратность степени десятки

Alexander "SonnySlave" Zaitsev
screenshot с тобой не согласны

Оно каждое сообщение про Раст начинает с дисклеймера про владения и аллокации?

Traveller Kolsky
Не думаю, что в fft требуется кратность степени де...

Там требуется, чтобы digit^2 * digit_count не округлилось

Αλεχ Zhukovsky
Начнем с того что хранить чанки по 10к вместо u32:...

на практике можно сразу брать какой нибудь __mm и не париться. Сложно представить где будет не достаточно 512 битных интов или сколько там сейчас. Думаю компилятор примерно так и сделает если не пессимизировать

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Good afternoon, I just started learning php in conjunction with mysql. I am registering a system on a local Mamp server using phpMyAdmin. It seems to be stored normally in the...
ManGo
1
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Добрый день! Такая проблема возникла, написал код на Python, который компилирует, собирает и запускает файлы .s А в случае работы нужно то же самое делать для .asm Чем эти фа...
A Mori
5
Всем привет! procedure TForm1.FormCreate(Sender: TObject); type TStartEnd = record S: Byte; E: Byte; end; var a, b: TStartEnd; begin {1} a.S := 1; {2} a.E := 2; ...
Руслан Михайлович
10
Карта сайта