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

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

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

26 ответов

34 просмотра

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

ныа, держи: 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 хлеб не отобрал в том числе и у ржавых

Kivooeo 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 битных интов или сколько там сейчас. Думаю компилятор примерно так и сделает если не пессимизировать

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта