
2 Описание программы
2.1 Общие сведения.
Моя программа назевается – «Application0».
Для функционирования программы необходимо:
- Операционная система: Windows 2000 или выше.
- Процессор: 233 MHz или выше.
- Оперативная память: 64 Мб или выше
- Видеоадаптер и монитор: VGA (640 x 480) Super VGA (800 x 600) или выше
- Свободное место на HDD: 0.5 Гб или больше
- Устройства взаимодействия с пользователем: клавиатура и мышь
Языки программирования, на которых написана программа: эта программа написана с помощью программы «Microsoft Visual Studio 2012» на языке программирования C++.
2.2 Функциональное назначение.
Программа «Application0» выполняет арифметическую возведения в квадрат, особенность этой программы в том, что она так же может возведения в квадрат числа размерности около 512 бит. Так же эту программу возможно использовать, как часть более сложной программы-калькулятора.
Ограничение этой программы в её быстродействии работы над числами приближенным к размерности в 512 бит.
2.3 Описание логической структуры.
Хранить
длинные числа будем в виде вектора
чисел ,
где каждый элемент - это одна цифра
числа.
Для
повышения эффективности будем работать
в системе по основанию миллиард, т.е.
каждый элемент вектора содержит
не одну, а сразу
цифр:
Цифры будут храниться в векторе в таком порядке, что сначала идут наименее значимые цифры (т.е. единицы, десятки, сотни, и т.д.).
Кроме того, все операции будут реализованы таким образом, что после выполнения любой из них лидирующие нули (т.е. лишние нули в начале числа) отсутствуют (разумеется, в предположении, что перед каждой операцией лидирующие нули также отсутствуют). Следует отметить, что в представленной реализации для числа ноль корректно поддерживаются сразу два представления: пустой вектор цифр, и вектор цифр, содержащий единственный элемент - ноль.
Эта программа может быть в дальнейшем связана с комбинированной программой-калькулятором, которая будет не только возводить в квадрат но и производить другие сложные операции.
2.4 Используемые технические средства.
В работе я использовал ноутбук Acer Aspire 7741ZG
:
Процессор - Intel Pentium P6200 (2 ядра, 2 потока, 2,13 ГГц, 512 Кбайт L2, 3072 Кбайт L3).
Память - 4096 Мбайт DDR3-1066.
Чипсет - Intel HM55.
Видеокарта - AMD Radeon HD6550M 1024 МБ
Жесткий диск 500 Гбайт (5400 об/мин, SerialATA).
Порты - ExpressCard / 3 порта USB 2.0 / RJ-11 (модем) / RJ-45 (LAN)/микрофонный вход/линейныйvвыход Операционная система - Windows 8 64-bit.
2.5 Вызов и загрузка.
Программа запускается при помощи файла «Application0.exe»(размер 96 KB)
При запуске программа использует 800КБ операционной памяти. После выполнения этой программой операций возведения в степень, её размер не увеличился, что свидетельствует о качественности программы.
Всего папка с программой занимает 14,2 МБ на жестком диске.
2.6 Входные данные
Для оптимальной работы с программой, вам потребуется клавиатура. С её помощью нужно будет вводить нужные вам числа.
Одно число надо указывать без пробела, знаков препинания и букв алфавитов – только с помощью десяти цифр – 1, 2, 3, 4, 5, 6, 7, 8, 9, 0. Так же нельзя первой цифрой в числе указывать 0 иначе, могут возникнут ошибки. После ввода одного числа вам надо нажать клавишу Enter и вы получите результат.
2.7 Выходные данные
В выходных данных вы увидите набор цифр, который будет являться результатом возведения в квадрат введенного числа. С помощью рисунка 2.1 убедимся в её подсчете больших чисел.
Рисунок 2.1 – « Подсчет больших чисел»
ВЫВОД
Я рассмотрел, один из самых значимых методов возведения в квадрат арифметического подсчета в области больших чисел – этот метод называется «Классический алгоритм».
Это алгоритм аналогичен школьному алгоритму умножения «столбиком», но всё же реализация его в машинном коде была не такой уж и простой.
Трудности возникли в том, как передать ЭВМ эти большие числа, ведь они не влезали в разрядность типа и разрядность операционной решетки. Выходом было представления этих чисел как элементы вектора.
В итоге я реализовал программу выполняющую возведения в квадрат больших целых чисел (512 и более бит). В итоге я считаю, что с поставленной задачей справился: теорию усвоил и подтвердил это работающей, исправной программой.
ССЫЛКИ
1 «Искусство программирования» том 2 - Получисленные методы раздел 4.3 – Алгоритм сложения-вычитания.
2 «Искусство программирования» том 2 - Получисленные методы раздел 4.3 – Алгоритм умножения.
3 «Искусство программирования» том 2 - Получисленные методы раздел 4.3 – Алгоритм деления.
СПИСОК ИСПОЛЬЗОВАНВЫХ ИСТОЧНИКОВ
1 Вікіпедія [Електронний ресурс] – Режим доступу: http://ru.wikipedia.org/wiki/Кнут,_Дональд_Эрвин.
2 Дональд Кнут Искусство программирования, том 2. Получисленные методы = The Art of Computer Programming, vol.2. Seminumerical Algorithms. — 3-е изд. — М.: «Вильямс», 2007. — 832 с. — ISBN 5-8459-0081-6.
3 Форум программистов и сисадминов [Електронний ресурс] – Режим доступу: - http://www.cyberforum.ru/
4 Форум программистов [Електронний ресурс] – Режим доступу: - http://forum.codeby.net/forum8.html
5. Н.Смарт. Криптография /Н.Смарт. 2005. –М.:Техносфера.– 528с.
6.Горбенко І.Д., Гріненко Т.О. Захист інформації в інформаційно-телекомунікаційних системах: Навчальний посібник. Частина 1: Криптографічний захист інформації. – Харків. ХНУРЕ, 2004. – 376 с.
ПРИЛОЖЕНИЕ А
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <string>
#include <conio.h>
#include <vector>
#include <time.h>
using namespace std;
typedef vector<int> lnum;
int main()
{
const int base = 1000*1000*1000;
lnum a;
unsigned char *s=new unsigned char[64+1];
cout<<"enter the number:";
cin>>s;
for (int i=strlen((char *)s); i>0; i-=9)
{
s[i] = 0;
a.push_back (atoi (i>=9 ? (char *)s+i-9 : (char *)s));
}
while (a.size() > 1 && a.back() == 0)
a.pop_back();
lnum c (a.size()+a.size());
for (size_t i=0; i<a.size(); ++i)
for (int j=0, carry=0; j<(int)a.size() || carry; ++j)
{
long long cur = c[i+j] + a[i] * 1ll * (j < (int)a.size() ? a[j] : 0) + carry;
c[i+j] = int (cur % base);
carry = int (cur / base);
}
while (c.size() > 1 && c.back() == 0)
c.pop_back();
cout<<"\ncount:";
printf ("%d", c.empty() ? 0 : c.back());
for (int i=(int)c.size()-2; i>=0; --i)
printf ("%09d", c[i]);
cout<<endl;
system("pause");
return 0;
}