Comments 95
Метод, которому учат большинство детей в школе, — длинное умножение — включает в себя много шагов с отдельными произведениями, которые нужно записывать и позже комбинировать.
В голове:
27*9 = 180+63 = 243
32*9 = 270+18 = 288
16*12 = 160+32 = 192
Это пока все в 3 операции укладывается в голове. А вот умножить 17 на 16 уже сложнее, потому что нужно 170 + 7*16, а это ещё одно разложение (70+42), итого 4 операции. Это уже сложно в голове держать.
Вообще, если чисто близко к круглому, как ниже уже сказал nin-jin, лучше не суммировать, а вычитать из круглого произведения. Получится 20 × 16 - (16 × 3) = 320 - 48 = 272.
Частный случай, конечно, но таблицу квадратов до 20 мы в школе учили
17 * 16 = 17^2 - 17 = 289 - 17 = 272
upd: ну или наоборот 16^2 + 16 = 256 + 16 = 272
"умножить 17 на 16" это точно не "170 + 7*16" Лучше расписывать сразу подробнее, чтобы не ошибаться: 17*10 + 17*6. А по сути - именно подобный быстрый счёт со знанием таблицы умножения оптимален для массового обучения младших школьников. Более древние методики хоть и полезны для кругозора, но не так эффективны для человеческого разума, в том числе описанный в статье "двоичный" способ
Который к тому же описан неправильно. Ни в одном из примеров, где получается двузначное число в левой столбце, не происходит двукратного умножения:
В правом столбце удваивайте число столько раз, сколько цифр содержит число в левом столбце.
А если бы это и работало, то по описанию непонятно, подсчет цифр нужно делать до того, как откинем дробную часть или после.
Во-первых, вычитание (и его сокращённая форма – деление) в уме даётся сложнее суммирования-умножения. А во-вторых, у вас ошибка по невнимательности.
А вот умножить 17 на 16 уже сложнее, потому
16*16+16 =256+16=272 .
Не, случай частный, понятно, но тут прям вот.
По «русскому» методу 17*16 превращается в … 17*16 ! Как и для любого умножения на число "степени двойки", а для (второго) числа, которое не является степенью двойки требуется (по факту) расположить это числа на степени двойки ...
Так что для устного счета метод подойдёт только гениями устного счета.
Это просто древний Египетский метод, который только интересен тем, кто интересуется математикой.
Но ведь интересен же !!! :-)
Метод позволяет лучше понять "привычное" умножение, вдуматься в суть процесса.
Все предложенные примеры легко решаются в уме быстрее чем было бы на бумажке расписывать этим способом. Если же нужно решить действительно сложный пример, и есть время на всю эту писанину, то есть время и на то, чтобы вытащить из кармана телефон и вбить числа в калькулятор. "Русский способ умножения" выглядит как абсолютно бесполезная ерунда.
"Русский способ умножения" выглядит как абсолютно бесполезная ерунда.
Этот способ умножения предназначен для тех, кто не знает таблицы умножения.
Но знает таблицу деления.
Но знает таблицу деления.
При делении ответ подбирается. Например, при делении столбиком, как нас учили в школе, предполагается очередная цифра ответа и догадка проверяется умножением. При делении на 2 догадка легко проверяется сложением. Тем более, что в задачах крестьянина 19 века числа обычно небольшие.
Зато он в двоичном виде - сдвиг и сумматор, причем складывать меньше чем сдвигать.
Все предложенные примеры легко решаются в уме быстрее чем было бы на бумажке расписывать этим способом.
Это Вы ещё китайский способ не видели (где надо рисовать линии по значению цифр и считать точки пересечения)
Странно почему он для этого не использует $mol
А вот умножить 17 на 16 уже сложнее
Пример неудачный, несложно:
17*6= 60+42=102
170+102=272
Кажется, для умножения на девять проще идти через десятку
27*9 = 270 - 27 = 243
32*9 = 320 - 32 = 288
27*9 проще же , умножить на 10 и вычесть 27
Я чаще так решаю:
32*9 = 320-32
27*15 = 270+135
Программисту не нужно даже вычислять 32 * 9, потому что это константа 288 )
нас в школе научили считать умножение обычным столбиком. Позже все это стало удаваться сделать в голове.
Пипец какое замороченное умножение, где приходится делать кучу куда более сложных делений. Есть метод проще, где всего три простые операции в уме:
9*27 = 10*27 - 27 = 270 - 30 + 3 = 240 + 3 = 243
9*32 = 10*32 - 32 = 320 - 30 - 2 = 290 - 2 = 288А дальше можно обычное инженерное 93*94 = 8100 + x, пускай будет ~10 000, ну ладно 9
округляем вверх! Памяти много не бывает
93*94 = 10_000 - 7*100 - 6*100 + 6*7 = 10_000 - 1300 + 42 = 8_700 + 42 = 8742
Для примерного счета можно использовать двойное округление вверх с вычетанием.
93*94 ~ 93*100 - 6*90 ~ 8760
54*94 ~ 54*100 - 6*50 ~ 5100
(93 х94) = 100 х (1-0,07) х 100 х ( 1-0,06) ≈ 10000 х (1-0,07-0,06) = 8700
Аналогично, считаю всегда также.
Даже в более сложных кейсах так проще разложить, а потом собрать:
7 * 27 = 10 * 27 - 3 * 27 = 10 * 27 - 3 * 30 + 3 * 3 = 270 - 90 + 9 = 189Несмотря на сложную запись, в голове это считается почти мгновенно.
А можно проще 9*27= 270- 27 =243 или же 180 + 63 = 243))) делов то!
9х32 это 9х16х2 или 12х12х2, т.е. 144х2.
А степени тройки вообще в памяти где-то висят, как и степени двойки (9х27 это 3^2*3^3 = 3^5)
Описание метода какое-то кривое (кривой перевод?), да и во втором примере, при перемене мест множителей оно не выполняется. "В правом столбце удваивайте число столько раз, сколько цифр содержит число в левом столбце." - надо просто удваивать.
Тоже голову сломал читая эту концепцию. 9 27 0 - в левом столбце - 9 - одна цифра. Один раз удвоил.
И 27 * 9 = ну два раза 9 удвоил и всё?)
Кстати есть статья из 2015 тоже с кривым переводом
Это они еще счет древних русов не видели
Да ну, в десятичной системе удобнее и быстрее в десятичный столбик считать, а не в двоичный.
Ну, 150 лет назад вес, длинну, время, объём, количество, и, самое главное, деньги - в русской деревне всё считалось в двоичной системе. А такие невообразимо сложные вещи, как возраст или день года, вообще не считались, а отсчитывались от приметного события.
Если ещё на нескролько веков назад отмотать, то в русском языке, помимо единственного и множественного, есть ещё и двойственное число.
Сейчас нас сплошь окружает десятичная система. Чтобы посчитать в двоичной и понять, сколько же это, надо ещё туда-сюда в двоичную систему и обратно перевести. А раньше - наоборот:
Два-пять шапок серебра!
То, есть, это будет десять?
Царь велел тотчас отвесить.
Два-пять шапок серебра!
Римское V - пятерня, 5 пальцев. Римское Х - 2 пятерни.
Ну, 150 лет назад вес, длинну, время, объём, количество, и, самое главное, деньги - в русской деревне всё считалось в двоичной системе.
Одноразрядные, что ли? 0 или 1?
Есть деньги\нет денег. Ничего и не поменялось =)
Ну, слушайте, расскажу про винишко, знанием иных мер вам врят ли в жизни пригодится блеснуть.
В винном бочонке два полубоченка
В полубоченке две корчаги
В корчаге два ведра
В ведре два полуведра
В полуведре две четверти
В четверти две получетверти или же две двойные бутыли
В получетверти две бутылки
В бутылке три!!! стакана
В бутылке же две косушки
В косушке две чарки
В чарке два шкалика
А шкалик, это примерно дринк, на современный англицкий манер.
Кстати, английский фунт, одна из последних денежных единиц, перешедших на десятичную систему, ажно в 1971 году. До этого была двоичная (с добавочным хитрым перепрыгом между полукроной и фартингом).
Если ещё на нескролько веков назад отмотать, то в русском языке, помимо единственного и множественного, есть ещё и двойственное число.
А если отмотать много веков и переместиться южней, то в древней Месопотамии использовалась шестидесятеричная система исчисления.
Собственно говоря, часы до сих пор на ней основаны.
GCC использует этот алгоритм, для платформ, у которых нет аппаратного умножения. Например, для простейших RISC-V.
Там, где мы в C напишем
uint32_t a, b;
// Тут мы получаем откуда-нибудь значения
// ...
// А вот тут как раз наше умножение
uint32_t c = a + b;GCC вставит функцию по ссылке выше, если в чипе нет умножения.
Потому что этот алгоритм - то же умножение в столбик, только в двоичной записи.
"крестьянское умножение"
9 27
---
9 27 | 27
4 54 | 0
2 108 | 0
1 216 | 216
---
216 + 27 = 243
И умножение в столбик
9 = 1001₂
27 = 11011₂
. 11011
. 1001
-----------
1| 11011 | 27 * 1*2⁰ = 27 | Вот "27", появившаяся при нечетной 9
0| 0 | 27 * 0*2¹ = 0
0| 0 | 27 * 0*2² = 0
1| 11011 | 27 * 1*2³ = 216 | Вот "216", появившаяся при нечетной 1
-----------
. 11110011 | 216 + 27 = 243
"Болгары восхитились" (с)
Тут первый множитель раскладывается на сумму степеней двойки
9х27 = (2х2х2+1)х27 = 216+27
27х9 = (2х2х2х2+2х2х2+2+1)х9 = 144+72+18+9
При такой записи столбиком получается кэширование и переиспользование результатов. Интересно, но обычное умножение столбиком гораздо быстрее.
И это новый способ умножения? Только путает, имхо.
27×9=3*9*9=3*3²*3²=3⁵=243
// просто приводим к степеням тройки
Когда нельзя просто привести к такому удобному виду, всё равно множители в числах можно перегруппировать, и это будет гораздо удобнее заумных способов.
А вот из действительно удобного, например в процентах, можно представить 40% от 75 как 75% от 40 (перевернуть наоборот), и так практически с любыми, т.к. это по сути аналогично a×b=b×a.
Уверен, есть простой способ через π сделать
На небольшие степени двойки так проще всего умножать в уме, а на нечётные числа очень заморочено.
А потом придумали калькулятор
9 * 27 = 9 * 30 - 9 * 3
9 * 27 = 10 * 27 - 27
Так гораздо быстрее, как по мне.
Спасибо. Всегда были интересовался разными способами ариф. действий
В книге "Структура и интерпретация компьютерных программ" (SICP) этот метод назван "методом русского крестьянина".
9*27=10*27-27
Это алгоритм быстрого умножения (через сложение). Буквальный аналог быстрого возведения в степень (через умножения). Предназначен для тех, кто не знает таблицу умножения.
Чтобы умножать столбиком, нужно месяц учить таблицу умножения. А этот алгоритм можно освоить за несколько минут.
static long Power(long x, int n)
{
var result = 1L;
while (n > 0)
{
if ((n % 2) == 0)
{
x *= x;
n /= 2;
}
else
{
result *= x;
--n;
}
}
return result;
}В строках 8 и 13 заменяем умножение на сложение.
static long Mul(long x, int n)
{
var result = 0L;
while (n > 0)
{
if ((n % 2) == 0)
{
x += x;
n /= 2;
}
else
{
result += x;
--n;
}
}
return result;
}Судя по источникам, "Американский" в заголовке этой статьи - это неприличное обобщение, а "русский способ" - должно быть заключено в кавычки.
Интересный метод! Но не для применения, а для понимания, как можно смешать двоичную и десятичную системы счисления.
Умножать надо через FFT, так быстрее.
* каждый раз, когда вам приходится перемножать числа от гугола-в-тысячной.
Schönhage–Strassen ... asymptotically faster than older methods such as Karatsuba and Toom–Cook multiplication, and starts to outperform them in practice for numbers beyond about 10,000 to 100,000 decimal digits
А теперь мы вам расскажем, как быстро перемножить матрицы такого размера...
не понял )) объясните
7 * 41 = ?
7 | 41
3 | 82
1 | 164
164 + 41 = 205, а должно 287
Можно также умножать на 11 - посредине сумма крайних цифр и прочие приёмы, чтобы свести к данным правилам, равно как для цифр, близких к 10 сложением-вычитанием
как сумма-разность квадратов итд. Ну и конечно же
(логарифмическая линейка), включая поиск по LUT. То есть достаточно запомнить хотя бы 2,4,8,16...65536. Включая метод последовательных итераций с остатками от деления, метод Ньютона применимо к умножению и др.
,
, найти
приближающее дробь к
за минимум итераций.
конкретно с умножением на 9 первое что приходит в голову 27*10 - 27)
"В правом столбце удваивайте число столько раз, сколько цифр содержит число в левом столбце"
Зачем вводить читателей в заблуждение? Так не работает. Умножаем 25 на 25
25 - 25
12 - 100 (удвоили дважды, потому как к левом столбце две цифры)
6 - 200
3 - 400
1 - 800
Ответ 800+400+25=1225. Да?
На самом деле удваивать надо всегда только один раз. Сам метод - хорошее упражнение для обучающихся программированию на инвариант цикла. Ну или для детей, изучающих математику - на индукцию. Доказывать удобнее, если представить, что сложение мы ведем по мере добавления строк и работаем с тройками чисел x, y, z. Вначале полагаем, что x и y наши множители, а z=0. Дальше делаем следующее:
при четном x уполовиниваем x, удваиваем y, переписываем z.
при нечетном x делаем то же, но дробную часть x отбрасываем, а z увеличиваем на y из предыдущей строки
Тогда в каждой строке x*y+z равно произведению первоначальных чисел. Поскольку в конце x=1, нам остается только подсчитать y+z. База индукции очевидна, шаг при четном x - тоже, шаг при нечетном x предоставляется читателю в качестве самостоятельного упражнения :)
Забавно, что метод знают под разными названиями, а суть у всех одна
Гораздо проще считать в уме!
Какое-то время назад была статья о том, как доказывать теорему Пифагора каким-то неведомым простым способом) Эта, видимо, в продолжение)
похоже на старинные алгоритмы умножения для старых процов. "младшими разрядами вперëд" и "старшими разрядами вперед".
школьники такое изобретали во времена zx-spectrum через сдвиги, флаг переноса и сложение
Американцы: русский способ умножения намного круче нашего