пятница, 28 апреля 2017 г.

ПРЕДСТАВЛЕНИЕ ДАННЫХ НА ЯЗЫКЕ С



Программы работают с данными. Вы вводите числа , буквы и слова в компьютер для того , чтобы он вы полнил какие-нибудь действия над этой информацией.

/*Программа на С состоит из одной или нескольких функций С. Каждая программа на С должна содержать функцию по имени main(), поскольку именно эта функция вызывается при запуске программы.

Описание функции включает заголовок и тело функции. Заголовок функции содержит имя функции и сведения о типе информации, передаваемой в функцию и возвращаемой из нее.

Используется:
- оператор объявления, определяющий имя и тип переменной
- оператора присваивания устанавливающий значение переменной
- оператор вывода
- оператор вызова функции
- оператор возврата
*/
//БУФЕР - ПРОМЕЖУТОЧНАЯ ОБЛАСТЬ ХРАНЕНИЯ

/*ФУНКЦИЯ в программировании — фрагмент программного кода (подпрограмма), к которому можно обратиться из другого места программы. Функция может принимать параметры и должна возвращать некоторое значение, возможно пустое. Функции, которые возвращают пустое значение, часто называют ПРОЦЕДУРАМИ.
ПОДПРОГРАММА (ПРОЦЕДУРА) (англ. subroutine) — поименованная или иным образом идентифицированная часть компьютерной программы, содержащая описание определённого набора
действий. ПОДПРОГРАММА может быть многократно вызвана из разных частей программы.
*/
/*ОПЕРАТОР ОБЪЯВЛЕНИЯ - назначает переменной имя и определяет тип данных, которые будут храниться в этой переменной. Имя переменной может служить идентификатором.
ОПЕРАТОР ПРИСВАИВАНИЯ - устанавливает значение переменной или область хранения.
ОПЕРАТОР ВЫЗОВА ФУНКЦИИ - запускает на выполнение функцию с указанным именем.
ПЕРЕМЕННАЯ ЭТО ВСЕГО ЛИШЬ ИМЯ ВЫДЕЛЕННОЙ ЯЧЕЙКИ ПАМЯТИ КОМПЬЮТЕРА, КОТОРОЕ МОЖНО ИЗМЕНИТЬ, ПОЭТОМУ НАЗЫВАЕТСЯ ПЕРЕМЕННОЙ
КОНСТАНТА - ДАННЫЕ КОТОРЫЕ ХРАНЯТЬСЯ В ЯЧЕЙКЕ.*/

Рассмотрим пример.


 #include <stdio.h>       
//КОМАНДА ПРЕПРОЦЕССОРА - подключение файла стандартной  библиотеки С stdio.h содержит библиотеку функций ввода-вывода 
int main(void)               
//ОБЪЯВЛЕНИЕ ФУНКЦИИ с именем main() - главная функция, каркас программы  на С
{
            float weight;                
//ОПЕРАТОР ОБЪЯВЛЕНИЯ. Инициализация переменной с именем weight-вес пользователя. Тип данных вещественные числа.
            float value;             
//ОПЕРАТОР ОБЪЯВЛЕНИЯ. Инициализация переменной с именем value-родиевый эквивалент. Тип данных вещественные числа.
             printf("Хотите узнать свой родиевый эквивалент, \n");     
//оператор вызова функции printf() - функция вывода на экран, аргумент функции printf() ->   "Хотите узнать свой родиевый эквивалент, \n"
            printf("Давайте подсчитаем. \n");          
//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ printf(),  аргумент функции printf() -> ("Давайте  подсчитаем. \n")
          printf ("Введите свой вес в футах: ");          
//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ аргумент функции printf() -> ("Введите свой  вес в футах:")
           
            /*получить входные данные от пользователя*/
            scanf("%f", &weight);                                                           
//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем scanf() - ввода данных с клавиатуры             (интерактивная функция)
           
            /*считаем что цена родия $770 за унцию*/
            /*14.5833 - коэффициент для перевода веса*/
            value = 770.0 * weight * 14.5833;                                            
//ОПЕРАТОР ПРИСВАИВАНИЯ (=) означает получить значение переменной weight,
//умножить его на 770.0 и на 14.5833 и присвоить результат вычисления переменной value
           
     printf("Ваш родиевый эквивалент составляет $%.2f. \n", value);  
//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() - функция вывода на экран. Имеет два аргумента.
      printf("Вы достойны этого! Если цена падает,\n");               
      printf("Ешьте больше для поддержания своей стоимости. \n");   
      return 0;                                                                                            //оператор возврата
}

Пояснения
В предыдущих программах объявлялись только целочисленные переменные (тип int), а здесь добавился тип переменной с плавающей запятой (тип float) , так что теперь вы можете обрабатывать более широкий спектр данных. Переменной типа float могут присваиваться вещественные числа.

//БУФЕР - ПРОМЕЖУТОЧНАЯ ОБЛАСТЬ ХРАНЕНИЯ

/*АРГУМЕНТ - ЭЛЕМЕНТЫ ИНФОРМАЦИИ, ПЕРЕДАВАЕМОЙ ФУНКЦИИ.
ФУНКЦИИ printf() и  scanf() не ограничены конкретным количеством аргументов.  Аргументы отделяются друг от друга запятыми. */

#include <stdio.h>      //КОМАНДА ПРЕПРОЦЕССОРА. Начало программы. Включить другой файл /*Эта строка требует от компилятора включить информацию, хранящуюся в файле stdio.h, который является стандартной частью всех пакетов компилятора языка С. Этот файл обеспечивает поддержку ввода с клавиатуры и отображения вывода. */

float weight;   //ОПЕРАТОР ОБЪЯВЛЕНИЯ. Оператор объявляет переменную с именем weight, и уведомляет, что переменная имеет тип float - ВЕЩЕСТВЕННОЕ ЧИСЛО
//Т.Е. Выделяет ячейку памяти и называет ее weight -> предполагается что в данной ячейке будут храниться вещественные числа.

В роли КОНСТАНТ выступают вещественные числа.

$%.2f - настройка внешнего вида выходных данных - этот символ обозначает - два знака после десятичной точки.

scanf("%f", &weight);                      //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем scanf() - ввода данных с клавиатуры (ИНТЕРАКТИВНАЯ ФУНКЦИЯ)
/*Спецификатор %f -> означает, что с клавиатуры должно считываться  число с плавающей запятой
&weight -> что введенное число будет присвоено переменной по имени weight
(& амперсанд) для указания на то, где можно найти переменную weight
ПЕРЕМЕННАЯ ЭТО ВСЕГО ЛИШЬ ИМЯ ВЫДЕЛЕННОЙ ЯЧЕЙКИ ПАМЯТИ КОМПЬЮТЕРА, КОТОРОЕ МОЖНО ИЗМЕНИТЬ, ПОЭТОМУ НАЗЫВАЕТСЯ ПЕРЕМЕННОЙ
КОНСТАНТА - ДАННЫЕ КОТОРЫЕ ХРАНЯТЬСЯ В ЯЧЕЙКЕ.*/

КОНСТАНТЫ
Константы - данные значения которых устанавливаются до начала выполнения программы и сохраняются неизменными в течение всего времени работы программы.

ПЕРЕМЕННЫЕ
Переменные - данные которые могут изменяться (в частности, путем присваивания новых значений) в ходе выполнения программы.

В данной программе weight - ПЕРЕМЕННАЯ
14.5833 - ЦЕЛОЧИСЛЕННАЯ КОНСТАНТА (ЦЕЛОЧИСЛЕННЫЙ ЛИТЕРАЛ)

Переменной можно присваивать значение или изменять его во время  выполнения программы.

ДАННЫЕ
Основные типы данных:
- числа
- буквы
- символы

int - целые числа
- long, short, unsigned, signed - ключевое слово

char - символьные данные
- буквы алфавита, #, $, %, *
- можно использовать для представления небольших целых чисел

Вещественные числа (числа с плавающей точкой)
- float, double, float double

Тип даннае Логических значений
_Bool -> (true, false)
_Complex -> комплексные числа
_Imaginary -> мнимые числа

Компьютер под управлением программы может делать многое. Он может складывать числа, сортировать имена, воспроизводить аудио· и видеоклипы, вычислять орбиты комет, составлять списки адресатов почтовых отправлений, набирать телефонные номера, рисовать картинки, делать логические выводы и многое другое из того, что придет вам в голову.
Для решения этих задач программа должна работать с данными: числа и символы являются той информацией , которую вы используете . Значения не которых данных устанавливаются до начала выполнения программы и сохраняются неизменными в течение всего времени работы программы . Такие данные называются константами. Значения других данных могут изменяться ( в частности, путем присваивания новых значений) в ходе выполнения программы. Такие данные называются переменными. В приведенной выше учебной программе weight представляет собой переменную
14.5833 - константу.

Биты. байты и слова
Термины бит (bit), байт (byte) и слово (word) могут использоваться для описания элементов компьютерных данных или элементов компьютерной памяти.
Минимальный элемент памяти называется битом. Он может хранить одно из двух значений: 0 или 1 . (Говорят также, что бит "сброшен" или "установлен". ) Конечно, в одном бите много информации не запомнишь, но в компьютере имеется огромное число битов. Бит представляет собой базовый строительный блок, из которых построена память компьютера .
Байт - это наиболее часто используемый элемент памяти компьютера. Почти во всех компьютерах байт образован из восьми битов, и это является стандартным определением байта.
Слово представляет собой естественный элемент памяти для компьютеров конкретного типа . В 8- разрядных компьютерах слово состояло из 8 битов. Ранние модели компьютеров, совместимые с компьютерами IBM , в которых использовался  микропроцессор 80286, были 16- разрядными . Это значит, что размер слова этих машин 00 был равен 16 битам. Машины с микропроцессорами типа Pentium и Роwег Macintosh , работают с 32-битовыми словами . Более мощные компьютеры могут и меть слова длиной 64 и более битов.
1 байт = 8 бит;
2 байт = 16 бит:
4 байт = 32 бит;
8 байт = 64 бит и т.д.
Целое число - это число без дробной части. В языке С целое число никогда не записывается с десятичной точкой. Целыми числами являются, на пример  2, - 23 и  2456 . Такие числа, как 3.14, 0.22 и 2.000, не принадлежат к классу целых чисел.
Целые числа хранятся в двоичной форме. Целое число 7 , на пример , записывается в двоичной системе как 111 .


Число с плавающей запятой называют вещественным числом. К вещественным числам относятся числа, находящиеся между целыми числами. Примерами чисел с плавающей запятой могут служить: 2.75, 3.16Е7, 7.00 и 2 е - 8 .

Число типа int - это целое число со знаком. Это значит, что число должно быть целым, а также что оно может быть положительным, отрицательным или нулем. Диапазон возможных значений зависит от компьютерной системы . Обычно для хранения данных типа int используется одно машинное слово . Поэтому в компьютерах, с  32-битовыми словами, для хранения данных типа int выделяется 32 битов. В этих условиях значения целых чисел находятся в диапазоне от - 32768 до + 32767.


Объявление переменных типа int
Для объявления целочисленных переменных служит ключевое слово int. Сначала идет ключевое слово int, затем выбранное вами имя переменной, после которого ставится точка с запятой. Несколько переменных можно объявлять либо по отдельности, либо в одном операторе, в этом случае после ключевого слова int помещается список имен, причем имена отделяются друг от друга запятыми.
Примеры допустимых объявлений переменных:
int erns;
int hogs, cows, goats;

Инициализация переменных
Инициализировать переменную - это значит присвоить ей начальное значение. В языке С это можно сделать в операторе объявления  Просто после имени переменной поставьте знак операции присваивания ( = ) и значение, которое необходимо присвоить переменной.
Пример:
int hogs = 21;

Тип данных char применяется для хранения символов, таких как буквы и знаки препинания, однако в техническом аспекте он является также целочисленным. Почему? Да потому, что тип char фактически хранит целые числа, а не символы . При работе с символами компьютер использует числовые коды, то есть определенные целые числа представляют определенные символы.

Объявление переменных типа char
Как и следовало ожидать, переменные типа char объявляются так же, как и другие переменные.
Пример.
char response;
char table, latin;

/* char code.c - отображает кодовое значение символа */
#include <stdio.h>
int main (void)
{
char ch; /
printf ("Bведите какой-нибудь символ.\n" ); /
 /*пользователь вводит символ*/
scanf ("%c", &ch );
printf ("Koд символа %с равен %d.\n" , ch, ch); /
return 0;
}

ВЫВОД НА ЭКРАН
Введите какой-нибудь символ.
с
Код символа С равен 67 .


РЕЗЮМЕ
В языке С имеется большое разнообразие типов данных. Основные типы данных подразделяются на две категории: целочисленные типы данных и данные с плавающей запятой. Двумя отличительными особенностями целочисленных типов являются объем памяти, выделяемый для размещения данных того или иного типа, и знак числа, то есть, со знаком данный тип или без знака. Наименьшим целочисленным типом является char, который,  в зависимости от реализации, может быть со знаком или без знака.
Функция printf () позволяет печатать различные типы значений, используя спецификаторы, которые в своей простейшей форме состоят из знака процента и буквы, указывающей тип, например , %d или % f.

/*СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ определяет каким образом данные преобразуются в отображаемую форму*/
%d //СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ десятичное число со знаком
%f       //число с плавающей запятой, десятичное представление
%c       //одиночный символ
%s       //интерпретирует введенные данные как строку
%e       //Экспонициальная форма
%a       //Двоично-экспонициальное представление
&         //спецификатор где можно найти переменную

Malware Analysis 1

Modify malware to baypass AV

Here we try to make malware analysis to modify PE section to Bypass AV As an example we use the very old malware nc.exe and look inside it, We open PEiD v 0.95 which one of the most popular analyzer executables. Good determines many packers and protectors.




IF we follow .text section - is the code section. We see just disassembler code


This tool can detected if the file was encrypted or not.



Using this too we can see the PE header also





Here we can see the memory buffer of our file



Then after this investigation and before modification we must make PE header writable.
But firstly check our file in AV detector


Before the changing signature of our file, make it writable. We will use LordPe  for our goal.



ASSEMBLY BASIC SYNTAX

assembler program is divided into three sections:
data section - initialized data or constants
bss section - variable declarations
text section - Storage code
rdata section    - Const/read-only (and initialized) data
idata section    - contains information about all DLL files required by the program
rsrc section     - holds information about the icon that is shown when looking at the
                                                           <br>executable file in the Explorer<br>
Sections ".idata", ".rdata", ".rsrc", ... do not contain program data (although their name ends with "data")
but they contain meta information that is used by the operating system.
.text: Code
.data: Initialized data
.bss: Uninitialized data
.rdata: Const/read-only (and initialized) data
.edata: Export descriptors
.idata: Import descriptors





Identifying a Signature
Signature of the file – File magic number: bytes within a file used to identify the format of the file; generally a short sequence of bytes (most are 2-4 bytes long) placed at the beginning of the file.

The Portable Executable (PE) format is a file format for executables, object code, DLLs, FON Font files, and others used in 32-bit and 64-bit versions of Windows operating systems. The PE format is a data structure that encapsulates the information necessary for the Windows OS loader to manage the wrapped executable code. This includes dynamic library references for linking, API export and import tables, resource management data and thread-local storage (TLS) data.

How to find the PE headers? Notice a few text strings such as “This program cannot be run in DOS mode”, “.text”, “.data” and “.rdata”, followed
by several hundred bytes of 0s. This is the PE header section of the program; the actual program instructions begin immediately after the 

section of 0s at offset 1000:

We use HExWorshop to see the signature

Changing File Signatures
Here are some easy ways of changing the signature of a program (packers, encryptors, etc), they may not always be viable options for those wishing to bypass anti virus applications. Additionally, it would be easy for anti virus companies to run a program such as nc.exe through a few popular packers/encryptors and add signatures for the resulting binaries to their virus databases as well. We will manually examining and editing the nc.exe. 

How to edit the signature of file? First open up nc.exe with Hex. If you scroll to the bottom of the hex dump, you see the last byte is located at offset 8EAF. Divide 8EAF in half and you get 4547; open up a goto box (Ctl+G) and go to the offset 4547 from the beginning of the file:

Select everything from 4547 to the end of the file (8EAF), right click, select ‘Fill’, and fill the selected section with 0s




Save your changes; when prompted to make a backup, say yes.

Then we get new  nc1.exe file
We can  eliminate the PE header, as it would not be used as part of a virus signature. Thus, we know that the signature must be somewhere etween offsets 1000 and 4547; this can be confirmed by zeroing or INT3and running a virus scan on nc.exe again:

Use Ollydbg 
The easiest way to identify where and how to change the program code is to open it up in a disassembler/debugger and analyze the resulting assembly code; for this we will use OllyDbg. Open up the original copy of nc.exe in Olly, and scroll up to the top of the code window.
Run F9
The enter point offset 00401160

Here we can see the map memory too

Now we can edit the assembler command


INT3 is a software interrupt that is used by debuggers to pause program execution. Since nc.exe obviously doesn't pause indefinitely during execution, these bytes are just filler and can be modified without worrying about affecting the program execution flow. Additionally, they are within the signature code which we need to modify. If you are using Olly, select one of these INT3 instructions.



We try manipulation with Binary changing NOP to INT3. Then we safe file and get new file. The most important that our new file dosnt lost any funtionality. As a result we get that our modifying malware can bypass the AV. As we see we get good result.



воскресенье, 16 апреля 2017 г.

THE HISTORY OF THE CALCULUS



The infinitives "to calculate", "to compute" (or the Middle English equivalent couten, from which we get "to count") and "to reckon", all have similar meanings related to the carrying out of numerical processes. Of these three phrases, the last two are closely associated, etymologically and in current meaning, with mental processes. The first, on the other hand, carries from its origin a connotation of nondeliberative manipulation, for "to calculate" once meant "to reckon by means of pebbles". The word "calculus" is the diminutive of the Latin calx, meaning "stone".
It is one of the ironies of history, then, that the phrase "the calculus" should have become firmly attached to a branch of maths which calls for subtlety and sophistication of thought in the highest degree. The inappropriateness of the term is clear from the fact that mastery of the calculus would be out of the question for any one who found it necessary to fall back on pebbles for computational purposes.

Conceptions in Antiquity
In the more formal sense, the calculus was fashioned in the seventeenth cen­tury A.D. (of our era), but the questions from which it arose had been asked for more than seventeen centuries before our era began. Egyptian hieroglyphic papyri and Babylonian cuneiform tablets include problems in rectilinear and cur­vilinear measuration that are appropriate to the domain of the calculus; but the treatment of these problems fell short of fully-fledged math stature in two serious respects: (1) there was no clear-cut distinction between results that were exact and those that were approximations only, and (2) relationships through deductive logic were not explicitly brought out. Perhaps the closest approach of the Babylonians to the calculus lay in an iterative algorithm they devised for finding the square root of any (rational) number. Had the Babylonians possessed any way of knowing or showing that the process is nonterminating, they might now be hailed as the originators of the subject of infinite sequences, a basic part of modern calculus. However, Babylonian skill in algebra was not matched by concern for logic; hence, credit for adumbrations of the calculus must go to the ancient people for whom the logical approach to a subject constituted a veritable passion.
It is universally admitted that the Greeks were the first mathematicians—first, that is, in the significant sense, that they initiated the development of maths from first principles. It was a shock to the Greek math community to learn that there are such things as incommensurable line segments and that the occurrence of such situations is commonplace—that is, that concepts akin to the calculus arise in the most elementary of situations. The Greek discovery of incommensu­rability confronted mathematicians directly with an infinite process. Whenever the Euclidean algorithm for finding the greatest common divisor of two integers is applied in arithmetic, the process comes to an end in a finite number of steps, for the set of positive integers has a smallest element, the number 1.
If, on the other hand, the analogous scheme is applied in geometric garb to finding the greatest common measure of two incommensurable line segments, the process will go on forever; there is no such thing as a smallest line segment — at least not according to the orthodox Greek view, nor according to conventional modern concepts. The prospect of an infinite process disturbed ancient mathe­maticians for here they were confronted with a crisis.
This view might preclude any Greek equivalent of the calculus; Eudoxus, nevertheless, suggested an approach that seemed to mathematicians as irrefuta­ble and served essentially the same purpose as an infinite process. Euclid's cal­culus (derived, presumably, from Eudoxus' "method of exhaustion") may have been less effective than that of Newton and Leibnitz two thousand years later; but in terms of basic ideas it was not far removed from the limit concept used crudely by Newton and refined in the nineteenth century. The purpose of Euclid in the "exhaustion lemma" (Book X) was to prepare the ground for the earliest truly rigorous comparison of curvilinear and rectilinear figures that has come down to us.

Archimedes and His Anticipations of Calculus
The ancient Greeks did have an alternative approach to integration, one that served as an effective aid to invention. This device was described by Archimedes, in a letter to Eratosthenes, simply as "a certain method by which it will be possible for you to get a start to enable you to investigate some of the problems in maths, by means of mechanics". The "certain method", which Archimedes correctly saw, would enable his contemporaries and successors to make new discoveries, consisted of a scheme for balancing against each other the "elements" of geometric figures.
A line segment, for example, is to be regarded as made up of points, a plane surface area is thought of as consisting of an indefinite number of parallel line segments; and a solid figure is looked upon as a totality of parallel plane elements. Without necessarily subscribing to the validity of such a view in maths, Archimedes found this approach very fruitful. The very first theorem he discovered through a balancing of elements was the celebrated result that the area of a segment of a parabola is 4/3 the area of a triangle with the same base and equal height. This is found by balancing lines making up a triangle against lines making up the parabolic segment. To demonstrate this result, which depends so much on brilliant intuition, Archimedes uses the method of exhaustion. He "exhausts" the parabolic segment by taking out successively inscribed triangles. The total area can be approximated by a sum of areas, which by proper grouping leads to a geometrical progression, each term of which is 1/4 the previous term. The sum of this infinite progression is 4/3 of the first term. Very carefully Archimedes shows that the area of the parabolic segment cannot exceed 4/3 of the area of the first inscribed triangle and, likewise, that it cannot fall short of it. Thus, he reaches his desired conclusion and by avoiding the pitfalls of infinitesimals and limit operations attains a level of rigour which compares favourably with anything done up to the eighteenth century. The Method of Archimedes could have been of greater significance in the development of the calculus if printing had been an invention of ancient times rather than the Renaissance. Copies of the Method evidently were never numerous, and for almost two millennia the work remained essentially unknown. In his work on areas and volumes Archimedes further developed the method of exhaustion, whereby the desired quantity is approximated by the partial sums of a series or by terms of a sequence. He obtained approximations to the area of a circle by comparing it with inscribed and circumscribed regular polygons.
No one in the ancient world rivalled Archimedes, either in discovery or in demonstration, in the handling of problems related to the calculus. Nevertheless, the most general ancient theorem in the calculus was due not to Archimedes, but to Greek mathematicians who lived probably half a dozen centuries later.
In the Mathematical Collection of Pappus (c. A.D. 320) we find a proposition awkwardly expressed but equivalent to the statement that "the volume generated by the rotation of a plane figure about an axis not cutting the figure is equal to the product of the area of the plane figure and the distance that the centre of gravity of the plane figure covers in the revolution". Pappus was fully aware of the power of this general theorem and of its analogue concerning areas of surfac­es of revolution. It includes, he saw, "any number of theorems of all sorts about curves, surfaces, and solids, all of which are proved at once by one demonstration". Unfortunately, Pappus does not tell us how to prove the theorem, and we do not know whether it was either discovered or proved by Pappus himself.
It is of importance to note that there are two aspects of the ancient beginnings in the integral calculus. One of these, stemming from Eudoxus, is represented by the rigorous method of exhaustion (illustrated in the proof of the theorem from Elements, Book XII, 2); the other arising out of atomistic views associated with Democritus, is related to the method of Archimedes. The former, not far removed from nineteenth-century concepts, was a faultless means of establishing the validity of a theorem. The latter, whether making use of indivisibles or of Archimedes' elements of lower dimensionality (more closely resembling the seventeenth-century stage of the calculus), was a device that led to the discovery of plausible conclusions. Archimedes exploited both aspects most successfully, indeed. His "mechanical" method led to theorems on areas, volumes, and centres of gravity which had eluded all of his predecessors; but he did not stop there. He went on to demonstrate these theorems in the traditionally rigorous manner through the method of exhaustion.
Up to this point we have stressed the similarity between the ancient method of exhaustion and the rigorous modern formulation of the calculus, but there are also essential differences. The ancient and the modern are in sharpest contrast with respect to motive. The method of exhaustion provided an impeccable demonstration of a theorem whose truth had been arrived at more informally. The substance of Elements, Book XII, for instance, had been assumed by earlier civilizations well over a millennium before Euclid's day. The value of the modern calculus, however, lies not so much in its power of rigorous demonstration as in its marvellous efficacy as a device for making new quantitative discoveries.
Were Eudoxus to reappear in the twentieth century, he might have difficulty in recognizing the descendants of the method of exhaustion; but in at least one respect he would feel completely at home in the maths of today. The drive for precision of thought from which the ancient integral calculus arose is matched today by a comparable insistence on rigour in analysis. Eudoxus would thus share the feeling of pride suggested in the continuing use of the phrase "the calculus", which sets the subject apart from the ordinary calculations that all too often are mistaken by the uninitiated as the preoccupation of mathematicians.

Medieval Contributions to the Calculus
Pappus was the last of the outstanding ancient mathematicians; following him, the level of maths in the Western world sank steadily for almost a thousand years. The Roman civilization was generally inhospitable to maths. Latin Europe in the twelfth and thirteenth centuries became receptive to classical learn­ing, transmitted through Greek, Arabic, Hebrew, Syriac, and other languages, but the level of medieval European maths remained far below that of the ancient Greek world.
However, a certain ingenious originality resulted in the fourteenth-century advance in a direction that had been avoided in antiquity. Archimedean maths, like Archimedean physics, had been essentially static; the study of dynamic change had been regarded as appropriate for qualitative philosophical discussion rather than for quantitative scientific formulation. But in the fourteenth century scholars began to raise such questions as the following: If an object moves with varying speed, how far will it move in a given time? If the temperature of a body varies from one part to another, how much heat is there in the entire body? One recognizes such questions as precisely those that are handled by the calculus; but me­dieval scholars had inherited from antiquity no math analysis of variables and I hey developed a primitive integral calculus of their own.
One of the leaders in this movement was Nicole Oresme (1323-1382), bishop of Lisieux. In studying, for example, the distance covered by an object moving with variable velocity, Oresme associated the instants of time within the interval with the points on a horizontal line segment (called a "line of longitudes"), and at each of these points he erected (in a plane) a vertical line segment ("latitude"), the length of which represented the speed of the object at the corresponding time. Upon connecting the extremities of these perpendiculars or latitudes, he ob­tained a representation of the functional variation in velocity with time — one of the earliest instances in the history of maths of what now would be called "the graph of a function". It was then clear to him that the area under his graph would represent the distance covered, for it is the sum of all the increments in distance corresponding to the instantaneous velocities. Oresme's results were further de­veloped by Galileo Galilei two and a half centuries later.
It is important to note, in connection with medieval studies in the latitude of forms, that there was no equivalent of the concept of differentiation. It is true that manuscript copies of the graphical representations of Oresme contain strong hints of the differential triangle. It should have been obvious in the latitude of forms that the representation of a rapidly increasing quantity called for a rapidly increasing latitude with respect to longitude; yet, no systematic terminology or method of handling such a concept was developed either in antiquity or during the medieval period.

The new role of indivisibles was adopted in maths during the Renaissance period through the work of Galileo's disciple Bonavenlura Cavalieri. In 1635 in his book, the indivisible, or fixed infinitesimal, was applied so successfully to problems in the measuration of areas and volumes that the fundamental postulate, usually bearing the name "Cavalieri theorem" has remained in elementary textbooks to this day. " If two solids (or plane regions) have equal altitudes, and if sections parallel to the bases and at equal distances from them are always in a given ratio, then the volumes (or areas) of the solids (or regions) are also in this ratio." This principle permitted Cavalieri to pass from a strict correspondence of indivisibles in a given ratio to the conclusion that the totalities of these indi­visibles (i.e., the figures of higher dimensionality) were also in this ratio. The method of indivisibles was not the property of Cavalieri, the idea behind it was not really new in 1635, for it is essentially related to the mechanical method of Archimedes and to the graphical integrations of Oresme and Galileo. Kepler had used the idea when he found the area of the ellipse to be

Cavalieri ingeniously applied the idea of indivisible to a wide variety of new problems. Cavalieri, like his contemporaries, regarded his method of indivisibles as part of geometry; but even as he was writing, an analytic revolution due to Descartes and Fermat was sweeping through Europe and inevitably changed the course of infinitesimal analysis.

Pierre de Fermat, Isaac Barrow
There is every reason to acknowledge, with P. S. Laplace, that P. Fermat was the inventor of the differential calculus, as Eudoxus has been recognized as the inventor of the integral calculus. Fermat's method of integrating x" was the most elegant of those available at the time, and it came closer to the modern Riemann integral than any other before the nineteenth century. Fermat showed that for all rational values of except n = — 1,

This work by Fermat, unfortunately unpublished at the time, brought to a climax the methods of integration initiated by Eudoxus two millennia before.
But Fermat, the greatest of all amateurs in maths, was responsible for an even more significant contribution to the development of the calculus. He was literal­ly the inventor of the process that we now call "differentiation". During the very years in which he and Descartes were inventing analytic geometry, Fermat had discovered an amazingly simple method for finding the maxima and minima of a polynomial curve. Did Fermat, who was well aware of the rules for differentiating and integrating, notice the relation between these? He apparently knew full well that in the first case one multiplied the coefficient by the exponent and lowered the exponent by one unit, whereas in the latter case one increased the exponent by one unit and divided the coefficient by the new exponent. Strangely, Fermat saw nothing significant in this striking inverse relationship, nor did his contemporaries, such as, for example, Isaac Barrow. Barrow, who was a teacher of Isaac Newton, published a rale of tangents much like Fermat's method of maxima and minima, in which the interplay of coefficients and exponents again was clear.
Fermat's method for maxima and minima and Barrow's tangent rule were by no means the only devices and formulas invented in connection here. Many other mathematicians noted the play of coefficients and exponents in finding tangents and extrema of polynomials, and the inverse nature of tangent and quadrature problems. These results were finding applications in the sciences of that time: in Fermat's principle of least time in the refraction of light and in the dynamics of Christian Huygens. By the end of the second third of the seventeenth century all the rules needed to handle such problems in areas and rates of change, in maxima and tangents, were available. The time was now ripe to build the infinitesimal analysis into the subject we know as the calculus. No specific new invention was needed; the techniques were at hand. What was wanting was a sense of the universality of the rules. This awareness was achieved first by Isaac Newton, in 1665-1666, and again, independently, by Gottfried Wilhelm von Leibnitz in 1673-1676.