Definition and History of Algorithms
– An algorithm is a finite sequence of rigorous instructions used to solve specific problems or perform computations.
– Algorithms are used as specifications for calculations and data processing.
– They can use conditionals and automated decision-making to divert code execution.
– Algorithms can deduce valid inferences and achieve automation.
– Heuristics may not guarantee correct or optimal results.
– Step-by-step procedures for solving mathematical problems have been used since antiquity.
– Babylonian, Egyptian, Indian, Greek, and Arabic mathematics all had algorithms.
– These ancient algorithms included methods for finding greatest common divisors and cryptographic algorithms.
– The Ifa Oracle, a divination system, also used algorithms.
– These algorithms were developed before the formalization of the term.
– Muḥammad ibn Mūsā al-Khwārizmī wrote texts on Indian computation and arithmetic around 825.
– Latin translations of al-Khwarizmi’s texts appeared in the early 12th century.
– The term ‘algorithm’ is a Latinization of al-Khwarizmi’s name.
– The English word ‘algorism’ was attested around 1230 and adopted from French.
– The term ‘algorithmus’ emerged in the 15th century under the influence of the Greek word ‘arithmos.’
– The English word ‘algorism’ is attested in the 13th century and used by Chaucer in 1391.
– The Latin word ‘algorithmus’ was altered to ‘algorithm’ in the 15th century.
– Early dictionaries defined ‘algorism’ as the art or use of cyphers and ‘algorithmus’ as skill in accounting or numbering.
– By at least 1811, ‘algorithm’ was used to mean a step-by-step procedure.
– The term ‘algorithm’ is still used today to refer to a set of rules or a sequence of operations.
– In 1928, formalizations of algorithms began with attempts to solve the Entscheidungsproblem.
– Formalizations included recursive functions, lambda calculus, and Turing machines.
– These formalizations aimed to define effective calculability or effective method.
– Ada Lovelace’s diagram from Note G is considered the first published computer algorithm.
– These formalizations laid the groundwork for modern concepts of algorithms.

Expressing and Designing Algorithms
– Algorithms can be expressed in natural languages, pseudocode, flowcharts, etc.
– Natural language expressions of algorithms are verbose and ambiguous.
– Pseudocode, flowcharts, and control tables provide structured ways to express algorithms.
– Programming languages are used to define or document algorithms.
– Different representations of algorithms exist, such as machine tables, flowcharts, and quadruples.
– Algorithm design is a method for problem-solving and engineering algorithms.
– It is part of solution theories like divide-and-conquer or dynamic programming.
– Techniques for designing and implementing algorithms are called algorithm design patterns.
– Resource efficiency is an important aspect of algorithm design.
– Big O notation describes an algorithm’s runtime growth as input size increases.
– Simplicity and elegance are desirable qualities of algorithms.
– Good algorithms are adaptable, simple, and elegant.
– The length of time taken to perform an algorithm is a criterion for goodness.
– An elegant program is the smallest possible program for producing a specific output.
– There may be a tradeoff between speed and compactness in an elegant program.

Computers and Models of Computation
– A computer is a discrete deterministic mechanical device that follows instructions.
– Models of computation include discrete locations, counters, an agent, and a list of instructions.
– Minsky’s machine is a variation of Lambek’s abacus model.
– Minsky’s machine follows instructions sequentially, with conditional and unconditional jumps.
– Different algorithms can compute the same function.
– Types of Operations in a Minsky Machine: ZERO operation, SUCCESSOR operation, DECREMENT operation, Conditional GOTO operation, Unconditional GOTO operation.
– Translating an algorithm into a language that a computer can execute effectively is necessary.
– The computer must have the required instructions or functions to execute the algorithm.
– The choice of simulation model for the algorithm is arbitrary.
– The speed of execution can be influenced by the available instruction set.
– A programmer must know a language effective for the target computing agent.

Structured Programming and Flowchart Symbols
– Any algorithm can be computed by a Turing complete model.
– Four instruction types are required for Turing completeness: conditional GOTO, unconditional GOTO, assignment, HALT.
– Structured programming can be achieved using only these instructions.
– Additional canonical structures like DO-WHILE and CASE can be used for structured programming.
– Structured programs lend themselves to proofs of correctness using mathematical induction.
– Flowcharts are graphical aids used to describe and document algorithms.
– Flowcharts start at the top and proceed down.
– Primary symbols in flowcharts include directed arrows, rectangles, diamonds, and dots.
– Böhm-Jacopini canonical structures can be built using these symbols.
– Sub-structures can nest in rectangles if there is a single exit from the superstructure.

Algorithm Examples and Analysis
– One example is finding the largest number in a list using a simple algorithm.
– Euclid’s algorithm is an efficient method for computing the greatest common divisor of two integers.
– Euclid’s algorithm is one of the oldest algorithms in common use.
– Euclid’s algorithm can be used to reduce fractions to their simplest form.
– Euclid’s algorithm is part of many number-theoretic and cryptographic calculations.
– Euclid’s algorithm is used to find the greatest common divisor (GCD) of two numbers.
– It is based on the principle that the GCD of two numbers is equal to the GCD of the smaller number and the remainder of their division.
– The algorithm uses a series of steps, including measuring, finding the remainder, and interchanging numbers.
– Euclid’s algorithm can be implemented in both elegant and inelegant ways.
– The elegant version requires fewer instructions and isSources: