mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 20:12:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			46 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020, Itamar S. <itamar8910@gmail.com>
 | |
|  * Copyright (c) 2020-2021, Dex♪ <dexes.ttp@gmail.com>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include "UnsignedBigIntegerAlgorithms.h"
 | |
| 
 | |
| namespace Crypto {
 | |
| 
 | |
| /**
 | |
|  * Complexity: O(N^2) where N is the number of words in the larger number
 | |
|  * Multiplication method:
 | |
|  * An integer is equal to the sum of the powers of two
 | |
|  * according to the indices of its 'on' bits.
 | |
|  * So to multiple x*y, we go over each '1' bit in x (say the i'th bit),
 | |
|  * and add y<<i to the result.
 | |
|  */
 | |
| FLATTEN void UnsignedBigIntegerAlgorithms::multiply_without_allocation(
 | |
|     UnsignedBigInteger const& left,
 | |
|     UnsignedBigInteger const& right,
 | |
|     UnsignedBigInteger& temp_shift_result,
 | |
|     UnsignedBigInteger& temp_shift_plus,
 | |
|     UnsignedBigInteger& temp_shift,
 | |
|     UnsignedBigInteger& output)
 | |
| {
 | |
|     output.set_to_0();
 | |
| 
 | |
|     // iterate all bits
 | |
|     for (size_t word_index = 0; word_index < left.length(); ++word_index) {
 | |
|         for (size_t bit_index = 0; bit_index < UnsignedBigInteger::BITS_IN_WORD; ++bit_index) {
 | |
|             // If the bit is off - skip over it
 | |
|             if (!(left.m_words[word_index] & (1 << bit_index)))
 | |
|                 continue;
 | |
| 
 | |
|             size_t shift_amount = word_index * UnsignedBigInteger::BITS_IN_WORD + bit_index;
 | |
| 
 | |
|             // output += (right << shift_amount);
 | |
|             shift_left_without_allocation(right, shift_amount, temp_shift_result, temp_shift_plus, temp_shift);
 | |
|             add_into_accumulator_without_allocation(output, temp_shift);
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| }
 | 
