1

Тема: Непрактичне

Вам потрібні готові рецепти вирішення типових задач, побудовані на досвіді когось досвідченого? Історії успіху? Бідкання про насущні й об'єктивні проблеми? Рекомендації, як знайти дівчину, заробити багато грошей, зберегти здоров'я? Цього тут не буде — йдіть далі й не офтопте. Ця тема повністю присвячена обміну ідеями, що не мають практичного застосування. Приблизно як «кодофлуд», але ширше — я не маю наміру обмежувати тему виключно кодом (хоча й код теж буде) — нестандартні ідеї, винаходи велосипедів, велетенські полотна на тему чогось відстороненого, нікому непотрібні математичні розрахунки (у т.ч., з помилками) тільки вітаються. Критика — якщо це конструктивна критика, що дозволить доповнити непотрібні речі новим непотрібним функціоналом — також. Якщо щось із цього раптом виявиться комусь корисним на практиці — чудово, але я не ставив це за мету, створюючи цю тему.

---------------------------------------------------------------------------------
Для початку, гра (код незавершений і недостатньо роздутий, можна довести гру до досконалості, щоб залежність від неї ставала нездоланною, але й так можна шпилити):

Прихований текст
# -*- coding: utf-8 -*-
#:mode=python:#
from __future__ import unicode_literals
try: input=raw_input
except:pass
from random import randint
from time import time
from math import log10

#TODO: збереження/завантаження гри....

def simple(n):
    for i in range(2, int(n**.5)+1):
        if n%i==0: return False
    return True

s=''; maxn=100
while 1:
    print("Рiвень складностi: %0.3f"%(log10(maxn)-1))
    wrong=False
    n=randint(2, int(maxn))
    t=time()
    print("Назви якомога бiльше простих дiльникiв числа %d"%n+' (або "бувай!" для завершення)')
    s=input()
    t=time()-t
    if s=='':
        print("Здаєшся? :)")
        wrong=True
    else:
        try:
            # дозволити ** або ^ для степенів; пропустити знаки множення (*)....
            divisors=tuple(map(int, s.split()))
        except:
            print(s)
            break
        m=n
        for i in divisors:
            if m<2:
                print("Надто малий дiльник: %d"% i)
                wrong=True
                break
            elif m%i:
                print("Зайвий дiльник: %d"% i)
                wrong=True
                break
            elif not simple(i):
                print("Помилка: %d не є простим числом"% i)
                wrong=True
                break
            else: m//=i
    if wrong:
        # оштрафувати:
        maxn=max(maxn-maxn/10, 10)
        # показати правильну відповідь....
    else:
        print("Чудово!")
        # нарахувати бонус залежно вiд витраченого часу та добутку названих дiльникiв:
        maxn+=min(n/m / max(t/60,.5), maxn/2)

Як у це грати: програма називає число й пропонує знайти його прості дільники (всі чи хоча б один). Наприклад, для числа 24 правильною відповіддю буде «2 2 2 3», для числа 101 — «101». Для успішної гри потрібно вміти перевіряти подільність на прості числа (2, 3, 5, 7, 11 і т.д.) — можна просто ділити на це число й дивитися, якою буде остача, або можна використовувати методи перевірки подільності. Наприклад, ми знаємо, що всі числа, що закінчуються парною цифрою, є парними. Або числа, сума цифр яких ділиться на 3, діляться на 3. Такі способи перевірки подільності можна підшукати й для інших чисел — напр., для подільності на 7:
1) Розбиваємо число (напр., 12345) на дві частини: дві цифри праворуч (45) та решта цифр, що йдуть ліворуч від них (123).
2) Множимо ліву частину на 2 (123*2 = 246).
3) Додаємо отриманий результат до правої частини (246+45=291).
4) Якщо число, отримане в результаті, має три або більше цифр, повторюємо з ним дії 1...3 знов, і т.д., доки не отримаємо дво- чи одноцифрове число. (291 => 2*2 + 91 = 95).
5) Якщо отримане число більше за 50, віднімаємо 50, додаємо 1. (95 -50 + 1 = 46)
6) Якщо отримане число ділиться на 7, то й початкове число теж ділиться. (46 на 7 не ділиться, тому й 12345 теж не ділиться).

Подякували: бонд0071

2 Востаннє редагувалося P.Y. (19.09.2021 01:28:09)

Re: Непрактичне

Усі ці дії для перевірки подільності на 7 можна записати й менш багатослівно (тут і далі використовуватиму синтаксис мови Pascal, хоча це, скоріш, інструкції для самої людини, що робить перевірку подільності):

1: 2: 3:   n:= (n div 100)*2 + (n mod 100);  
4:           if n>99 then goto 1;
5:           n:= (n div 50) + (n mod 50);
6:           result:= (n mod 7)=0;

Це далеко не всі способи заміни більшого числа меншим, щоб спростити перевірку. Наприклад, можна ще робити так:

while n>10 do 
     n:= (n div 10)*3 + (n mod 10); // перевірка подільності на 7 без таблиці множення
result:= (7=n) or (0=n);

Або так:

while n>999 do
    n:= abs((n mod 1000) - (n div 1000));

Тепер, як до всього цього можна дійти самому, і чому це взагалі працює.
Якщо число n не ділиться на число d, то скільки б разів ми d до нього не додали чи відняли, отриманий результат не ділитиметься на d. І навпаки: Якщо n ділиться на d, то подільність так само зберігається.

Замість самого числа d, можна додавати чи віднімати й будь-яке інше число, що ділиться на d. Тому можна підібрати таке число, яке віднімати буде легко. Очевидно, що число назразок 1000 чи 2 додавати-віднімати буде легше, ніж, наприклад, 73 або 649 — тобто, кількість ненульових цифр у ньому має бути якомога меншою, і ці цифри мають бути якомога меншими. Також досить зручно додавати-віднімати якесь число, близьке до такого зручного: наприклад, 98 стоїть недалеко від 100, і замість того, щоб віднімати 98, можна відняти 100 й додати 2. (Оскільки 98=7*7*2, його можна використати для перевірки подільності на 7 чи 49).

Далі, такі числа ми можемо віднімати не по одному, а цілими серіями. Якщо відняти від числа всі сотні, які в ньому є, то це те ж саме, що отримати остачу від ділення: (n mod 100). Якщо ми робимо це з 98, то до остачі від 100 треба додати стільки двійок, скільки сотень ми забрали (тобто, поділити n на 100, відкинувши остачу, й помножити на 2). Виходить те, що було вище: (n div 100)*2 + (n mod 100)
А тепер погляньмо на це під іншим кутом: (n div 100) — це всі цифри числа n, крім останніх двох; (n mod 100) — дві останні цифри. Це дуже зручно рахувати усно.

Подякували: бонд0071

3

Re: Непрактичне

Залишається тільки одне питання.
А кому воно оце потрібно? Що з цього корисного? Який Ви кодер коли більше придумуєте філософсько-світоглядно-мовно-думок, та крім постів ще встигаєте вичитувати українсько-іноземну світоглядну літературу, що проглядається у ваших постах. Ви починаєте ставати таким же кодером як і я. Себто форумним.

А сам кодінг, як видно з даного посту, починає перетворюватися лише в інструмент для ігор (у майбутньому можливо тролінгу, коли Ви отримаєте задоволення від посту-гри що включає складно закодований вірус, який можливо знайти у коді, лише його на пам'ять вивчивши)

P.Y. написав:

Приблизно як «кодофлуд», але ширше — я не маю наміру обмежувати тему виключно кодом (хоча й код теж буде) — нестандартні ідеї, винаходи велосипедів, велетенські полотна на тему чогось відстороненого, нікому непотрібні математичні розрахунки (у т.ч., з помилками) тільки вітаються. Критика — якщо це конструктивна критика, що дозволить доповнити непотрібні речі новим непотрібним функціоналом — також. Якщо щось із цього раптом виявиться комусь корисним на практиці — чудово, але я не ставив це за мету, створюючи цю тему.

Конструктивна критика - непотрібний функційонал не потрібен, як і непотрібна втрата часу. Ви не можете робити щось, якщо вважаєте це непотрібним. Якщо Ви щось робите, це точно комусь потрібно. Можливо, Ви мали на увазі, не потрібне більшості?
Так, втрата часу справді потрібна лише одній істоті - лукавому. Бог дав час не для того, щоб його марнувати на завідомо непотрібні речі. Господи помилуй, спаси і сохрани. Краще зайнятися чимось корисним цивілізації.
Скажу про себе, я це пам'ятаю, але забуваю в деякі моменти і тоді народжуються пости адресовані пану факі і тому подібне (вибач Господи, постараюся це владнати)
Інша річ, Ви називаєте деякі речі непотрібними, які ними не є. Так, винахід велосипеда - це потрібна річ, а нестрандартні ідеї - іще потрібніша. На цьому жве весь світ винахідників, на якому живе бізнес і на цьому усьому живемо ми з Вами.


Якщо Вам потрібна справді не стандартна ідея, я підскажу одну із своїх.
Спробуйте зробити, маючи на це кошти, електронно-механічний симулятор м'язів тварин. (Я грошей не маю).
Це має бути конструкція що частково симулює скорочення м'язів завдяки притягуванню витків мідного дрота чи їх скпчень (котушок), що об'єднані на одному стрижні (волокні). на відміну від ротаційного двигуна, такий симулятор може приймати будь-яку форму, що зумовлена положенням відносно непорушних частин (ака "кісток")
Користь проекта у тому, що при доведенні до логічного кінця рецептів по створенню м'язів вдома, відпаде нехбхідність у ротаційних двигунах та редукторах, а процес створення роботів стане простим, як ніколи раніше, причому як для нас, так і для бізнесу, від чого ціна на такі роботи впаде і вони з'являться у наших оселях.

4 Востаннє редагувалося P.Y. (19.09.2021 14:16:36)

Re: Непрактичне

«Кому воно потрібно» і «Що корисного» — неправильні питання. Якщо вже хочете чогось практичного в непрактичній інтелектуальній діяльності, то «Дя чого?» — для інтелектуального задоволення, отримуваного від обробки цікавих думок. Те ж саме, для чого люди дивляться кіно, займаються сексом, їдять цукерки, грають у волейбол — просто для іншого типу задоволення.

Щодо «м'язу». Обертовий електричний двигун використовує магнітні котушки, що почергово відштовхуються одна від одної. Якщо ми розмістимо дві котушки не на обертовому роторі й нерухомому статорі, а вздовж однієї осі, повернувши полюсами одну до одної, то ці дві котушки, залежно від напрямку струму в кожній з них, або притягуватимуться одна до одної, або відштовхуватимуться одна від одної. Також можна їх доповнити пружинами, щоб розтягнення/скорочення відбувалось більш рівномірно... Як вам така ідея?

Подякували: бонд0071

5

Re: Непрактичне

Узагалі, існують пристрої, в яких електричний струм перетворюється безпосередньо в зворотно-поступальний рух без проміжного перетворення в обертовий рух. Це, наприклад, електричні діафрагмові насоси (вони ж мембранні), що працюють від змінного струму, коливання якого приводять у рух мембрану.

А ще якийсь час мене захопила ідея створення електрогенератора, що використовував би зворотно-поступальний рух, створюваний поршнями двигуна внутрішнього згоряння, без перетворення зворотно-поступального руху в обертовий, зразу генеруючи змінний струм.

Подякували: бонд0071

6

Re: Непрактичне

Думаю, одна з проблем для «м'язу» — нерівномірність сили, з якою магнітні котушки взаємодіють на різних відстанях.
Тобто, було б добре цю силу дещо збільшити, коли котушки далеко, й дещо зменшити, коли поруч.

Є деякі ідеї на цю тему:
1) Зробити механізм, що повертатиме котушки трохи боком, коли вони поруч, і ставитиме їх прямо, коли вони на максимальній відстані.
2) Змінювати струм, що подається на котушки, за допомогою реостату, вбудованого в механізм «м'язу».
3) Щось на тему сердечника складної форми чи з кількох рухомих частин, який переспрямовуватиме силові лінії магнітного поля так, щоб зміна при збільшенні-зменшенні відстані була рівномірною (треба обдумати детальніше).
4) Щось на тему гнучких обмоток, що можуть змінювати форму (втім, мабуть, це гірший варіант, ніж попередні).

Подякували: бонд0071

7 Востаннє редагувалося tchort (19.09.2021 12:40:26)

Re: Непрактичне

Узагалі, існують пристрої, в яких електричний струм перетворюється безпосередньо в зворотно-поступальний рух без проміжного перетворення в обертовий рух.

— Лінійні Актуатори. П'єзоелектричні найбільш енергоефективні, з тих що виробляють масово, наскільки пригадаю. (якщо не пірнати глибше в хай-тек екзотику).

*мають унікальні властивості так і очевидні недоліки. (це кристал, ефективного видовження діапазон не вражає навіть з тими пристосуваннями навколо них, що поліпшують ті характеристики...)

Також можна їх доповнити пружинами, щоб розтягнення/скорочення відбувалось більш рівномірно... Як вам така ідея?

Масив мікроскопічних пласких електромагнітів (які взаємно-притягуючись, викликають скорочення матеріалу який їх утримує), розташовані послідовно, в лініях що в свою чергу утворюють пучки, всередині пластичного полімеру. Де напруга на кожній такій "лінії" або пучку регулюється окремо. +існують "петлі" різної довжини всередині, для відхилення в сторони цього м'яз-подібного полімерного желатину... Як вам така ідея?

Питання ще навіщо той м'яз. Чи не можливо вирішити якусь задачу ефективніше, без нього(цього винаходу) та чи він буде в якомусь відношенні/аспекті в достатній мірі кращим за альтернативи, коли звісно буде працювати взагалі. "М'яз"...Не найбільш ефективний ротор чи актуатор взагалі, еволюція працювала з чим було та зібрала таку тонку й складну машину, - і разом з тим кінцевий результат в порівнянні зі "штучними" приладами не найкращий...імітувати його тут, навіть незнаю, звучить наче щось що потребує багатьох розрахунків та порівнянь матеріалів / дошукування таких, аби сказати чи можливо щось краще, чи щось з новими цікавими властивостями...
-------

Щось на тему сердечника складної форми чи з кількох рухомих частин...

-Звучить не дуже добре, інтуїція підказує що потужність того поля в цьому приладді впаде драматично.

Подякували: P.Y., бонд0072

8

Re: Непрактичне

5) Зробити котушки не круглими в перерізі, а овальними. Рухому котушку розмістити на гвинтовій направляючій — так, щоб при максимальному зближенні  котушки ставали повернутими на 90° одна до одної (довгими півосями до коротких), при максимальному віддаленні — точно одна навпроти одної.

Подякували: бонд0071

9 Востаннє редагувалося P.Y. (19.09.2021 13:00:42)

Re: Непрактичне

Масив мікроскопічних пласких електромагнітів (які взаємно-притягуючись, викликають скорочення матеріалу який їх утримує), розташовані послідовно, в лініях що в свою чергу утворюють пучки, всередині пластичного полімеру. Де напруга на кожній такій "лінії" або пучку регулюється окремо. +існують "петлі" різної довжини всередині, для відхилення в сторони цього м'яз-подібного полімерного желатину... Як вам така ідея?

Чи обов'язково їх робити мікроскопічними? Якщо вся конструкція має достатньо великі розміри, то, може, досить і просто мініатюрних, які виготовити й змонтувати буде простіше.

І як щодо охолодження? Обертові електричні двигуни обдуваються вентиляторами, щоб не згоріти (і тому на малих обертах такий двигун, якщо він крутить свій вентилятор сам, ризикує згоріти швидше). У даному ж випадку, желатиноподібний пластик, очевидно, не пропускатиме повітря до дротів. Отже, в ньому треба зробити «судини», по яких тектиме охолоджувальна рідина...

Подякували: tchort, бонд0072

10

Re: Непрактичне

Моя ідея з'явилася іще в минулому році. Замість сердечника із дроту я пропонував використовувати магнітну рідину.
Під час скорочення котушок мала б скорочуватися і трубка з рідиною, а рідина мала вижиматися із трубки у якийсь резервуар і навпаки.

На форумі хіміків (ру) цю ідею різко розкритикували, бо магнітна рідина має іще нижчий КПД, ніж осердя із суцільного заліза.

Ця вся імітація потрібна лише тому, що її вдома простіше виготовити, ніж підтримувати м'яз жабки у стані життя.

Подякували: P.Y.1

11 Востаннє редагувалося ReAl (19.09.2021 15:56:07)

Re: Непрактичне

tchort написав:

Узагалі, існують пристрої, в яких електричний струм перетворюється безпосередньо в зворотно-поступальний рух без проміжного перетворення в обертовий рух.

— Лінійні Актуатори. П'єзоелектричні найбільш енергоефективні, з тих що виробляють масово, наскільки пригадаю. (якщо не пірнати глибше в хай-тек екзотику).

*мають унікальні властивості так і очевидні недоліки. (це кристал, ефективного видовження діапазон не вражає навіть з тими пристосуваннями навколо них, що поліпшують ті характеристики...)

Це саме мікроактуатори, вони мають свою галузь використання.

Якщо мова не власне про аналог м'яза, а про лінійний рух без посередництва обертового, то навіть двигуни на змінному струмі вони є обертові та лінійні.
Тільки звичайний електродвигун без поданих на нього напруг вільно рухається, кроковий двигун з постійними магнітами має певний момент, але невеликий цілком прокручується рукою, а п'єзодвигун провернути рукою нереально. Навіть відносно невеликий, розміром з двигун руху головки від 3-дюймового дисковода.
Ті, з якими мав справу в 90-тих, мали таку структуру, тільки там цих щетинок сотні і сотні.

p.s. структура дещо інша була — кільцеві п'єзокристали і щетинки зі зносостійкого металу. Питомі потужність та момент (на об'єм двигуна) та технологічність набагато вищі.

Подякували: tchort, P.Y., бонд0073

12

Re: Непрактичне

Як гадаєте, на якому двигуні побудована ця модель? На п'єзо чи на лінійному?
https://www.youtube.com/watch?v=4xuIErOk2h0
P.S. Не відомо, як відбувається махання. За допомогою одного двигуна чи декількох. Але згідно з інф. наданої на більшості сайтів з побудови плахоподібних моделей, "крило та повітря являють коливальний контур", щось схоже на те, що при русі лише вверх-вниз, повітря саме повертає крило під потрібний кут. Якось так

13

Re: Непрактичне

Процес створення "м'яза" - намотування чогось на щось. В кінці показано робо-руку.
Мабуть доведеться нам то все випитувати у пана "Robert Wood"
https://youtu.be/9JWGiyr9FcE?t=205

14

Re: Непрактичне

Якщо м'яз приводиться в рух, наповнюючись рідиною, то необов'язково брати саме магнітну рідину й штовхати електромагнітом.
В найпростішому випадку, для демонстрації можна взяти й просто воду з крану, подачу якої регулювати клапанами. Але це вже чиста гідравліка пішла...

А що, як узяти не сердечник з магнітної рідини, а котушку з електропровідної (напр., спіральна трубка, по якій тече ртуть або галій)? Як сердечник притягується до котушки, так і котушка до сердечника. Здається, щось подібне використовують у системах охолодження на АЕС. Утім, це точно не для невеличкого домашнього проекту.

Подякували: бонд0071

15

Re: Непрактичне

Для охолодження та одночасно збереження гнучкості усе робиться значно простіше:
у тоненьку трубочку просовується жгут із проволочок по 0.07 мм, а в проміжках <наливається звичайна вода після монтажа>.
І цією трубочкою  робиться обмотка.


Але це вже викличе суттєвий нагрів рідини. Тобто, самі скорочення трубочки. Але рідина буде виштовхуватися та засмоктуватися.

А от якщо спобувати накласти "бутерброд" із фольги та ПВХ-плівки, щоб утворити пари конденсаторів, що з'єднані паралельно. На відміну від обмоток, коли магнітне поле зберігається лише при подачі струму, КПД знижується і виникає нагрів, той самий п'єзо чи конденсаторний ефект діє, заряджаючи механізм енергією. 1 раз подав і доки не розрядиться є.

При подачі струму по закону кулона фольга буде відштовхуватися, при припиненні скорочуватися.
Подаючи частоту, бутерброд буде вібрувати.
Тільки залишається одне, недоступне вдома. Це пайка алюмінієвої харчової фольги, яку, з власного досвіда, поки не порвеш фіг спаяяш.

16

Re: Непрактичне

бонд007 написав:

А от якщо спобувати накласти "бутерброд" із фольги та ПВХ-плівки, щоб утворити пари конденсаторів, що з'єднані паралельно. На відміну від обмоток, коли магнітне поле зберігається лише при подачі струму, КПД знижується і виникає нагрів, той самий п'єзо чи конденсаторний ефект діє, заряджаючи механізм енергією. 1 раз подав і доки не розрядиться є.

При подачі струму по закону кулона фольга буде відштовхуватися, при припиненні скорочуватися.
Подаючи частоту, бутерброд буде вібрувати.
Тільки залишається одне, недоступне вдома. Це пайка алюмінієвої харчової фольги, яку, з власного досвіда, поки не порвеш фіг спаяяш.

Не треба для такого паяти алюмінієву фольгу.
Якщо для виводів — то можна паятися до мідного скотчу, а його клеїти на фольгу чи краще на плівку з алюмінієвим напиленням, наприклад, ту що для захисту від сонця на вікна клеять (доведеться пам'ятати про пару мідь-алюміній, але то просто не треба використовувати у вогкому).
http://replace.org.ua/extensions/om_images/img/61475f087b15a/0ae91c9c02be95e856fb0f632c3760e4.jpg

Дивно, в Імраді алюмінієвий скотч є, а мідного нема, знайшовся лише найвужчий в неочікуваному місці. Але для виводів того досить.
Клей там струмопровідний, на площі контакту в квадратний сантиметр вже менше ома.
В «Філур-електрік» ми колись навіть свинцевий скотч замовляли, але то окремо під замовлення везли.

Подякували: tchort, бонд007, P.Y.3

17

Re: Непрактичне

тоді вже простіше робити з самого початку все... ні не із фольги, а з проволочки 0.07 для реле, яку наклеювати на скотч у вигляді спіралі та накладувати новий шар скотчу поверх. у такому разі, товщина обкладки буде ... 0.07 (70мкм)

але ж знову тупік. як так старанно із кроком 0.000001 мм вкласти ту спіраль на скотч?

ось поки набирав, придумав нове
Таки простіше робити напиленням міді на алюмінієву фольгу, а потім до тої міді паяти.

тільки ж знову, напилення може відвалитися
---------
щось іще простіше? ну вони ж якось робили к73-17 (ті що плівковці з напиленням)? хм... там була мабуть суцільна плівка, на яку то все напилювали і потім скручували її в рулон. і як же гарно пищить к73-17... але тре підбирати частоту
---------
енергія ні звідки не береться (с)
P=U*I. якщо не можна впливати на I, можна на U
Це іще краще, бо енергія конденсатора рахується ...*U*U
тобто, початкові 2 виводи + та - із мідної фольги з припаюванням і на них подавати якісь 2 кВ
хм... але буде розподіл і на кожному конденсаторі буде майже той результат що і при паралельному з'єднанні, з мене фізик поганий
-----------
Тоді можна зробити все ж на тому паралельному з'єднанні, а 2 кв надійно проб'ють шлях до контакту, навіть якщо той на якомусь скотчі... а мала ємність кондера при цьому не сильно просадить джерело.
хм... чому саме 2кв, скотч тримає лише 600В

та і взагалі хто сказав що пластини будуть вібрувати, якщо скотч їх триматиме міцно? Потрібен не просто скотч, а прошарок повітря, тобто 2 шари скотчу.

з мене зовсім кепський фізик

18

Re: Непрактичне

Поки не можу нічого додати до теми про штучний м'яз, продовжу свою оповідь про подільність.
Полотно третє.

Вище для перевірки подільності на 7 було використано той факт, що 98 (яке на нього ділиться) стоїть недалеко від 100 й трохи за нього менше. Подібним чином можна використовувати й числа, які трохи більші за круглі — проте, є деякі відмінності. Наприклад, для спрощеної перевірки подільності на 17 можна використати число 102=17×6, яке на 2 більше за 100:

while n>99 do
    n:= abs((a div 100)*2 - (a mod 100))

(Роблячи віднімання замість додавання, можна отримати від'ємне число. Знак не впливає на подільність, тому ми його відкидаємо — у паскалі це функція abs, яка робить те ж саме, що операція модуль |n| у математичних формулах).

Якщо, наприклад, у нас є число 13472, його слід розбити на 134 та 72; далі, 134*2-72=196. (Знаючи, що 196 на 17 не ділиться, можемо сказати, що й 13472 на 17 не ділиться, але продовжмо далі, щоб переконатися, що метод працює). 
196 => 1 96 => |1*2-96|=94 (на 17 не ділиться, чого й слід було очікувати).

Демонстрація з іншим числом, яке на 17 має поділитись:
25687 => 256 87 => 256*2-87=425
425 => 4 25 => |4*2-25|=17 — отже, 25687 ділиться на 17
(з чисел, менших за 100, на 17 діляться: 0, 17, 34, 51, 68, 85 — отримання будь-якого з них вказує на подільність початкового числа на 17).

Подібні методи підрахунку можна підібрати для багатьох дільників. Деякі з них — на вкладеному малюнку.

Post's attachments

divcheck.png 63.98 kb, 19 downloads since 2021-09-20 

Подякували: бонд0071

19

Re: Непрактичне

Далі, можна не обмежуватись степенями 10 — наприклад, перевіряючи подільність на 23, можна скористатися тим, що 23*13=299, що близько до 300.

while n>299 do
    n:= (n div 300) + (n mod 300)

На певному діапазоні значень ділити на 300 зручніше, ніж ділити на 100 й множити на 8:

while n>99 do
    n:= (n div 100)*8 + (n mod 100)

Можна поєднувати ці методи зменшення (якщо число велике, зменшуємо його, використовуючи 300, потім на діапазоні від 100 до 300 зменшуємо, використовуючи 100, після чого в нас лишається всього декілька чисел, що діляться на 23, з якими треба порівняти результат).

Подібні методи можна підшукати для більшості простих чисел. Якщо таке зменшення вимагає простіших обчислювальних дій, ніж просто ділення, в цьому є сенс. Або ж (із деякими змінами) цей же мотод можна використати для знаходження остачі без виконання ділення.

Зрозуміло, писати програми на звичайних мовах програмування, що перевірятимуть подільність таким способом, особливого сенсу нема. Можна рахувати таким способом усно. Або ж можна використати це в мовах програмування, що математичних засобів не мають — напр., sed (див. подільність на 7 і 13, подільність на 134).

Подякували: бонд0071

20

Re: Непрактичне

Візьмімо якесь число n в діапазоні від 2 до 2000 і спробуймо відгадати, чи просте воно.

Щоб число було простим, воно не повинне ділитися на жодне інше просте число. Нам не треба перевіряти подільність на всі прості числа, що лежать у цих межах — достатньо взяти лише ті з них, що менші √2000 (чи, точніше, лише менші за √n) — якщо число має дільники, то хоча б один із них буде меншим за це значення. √2000≈44,7, тому перевіряти доведеться лише на такі дільники: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43 — усього чотирнадцять перевірок.

2 та 5 перевіряються за останньою цифрою: якщо вона парна або дорівнює 5, то число не просте.

3 перевіряється за сумою всіх цифр: якщо ця сума ділиться на 3, то число не просте.

Для 11, додаємо всі пари сусідніх розрядів (або while n>=100 do n:=(n div 100)+(n mod 100), що те ж саме). Якщо в кінцевому результаті обидві цифри однакові, число не просте.

Для 7 і 13, якщо n>1000, робимо попереднє зменшення (необов'язкове)

while n>=1000 do n:=abs((n div 1000) - (n mod 1000))

Для 7 далі робимо

while n>=100 do n:=(n div 100)*2 + (n mod 100)

Для 13:

while n>=100 do n:=abs((n div 100)*4 - (n mod 100))

Для 17:

while n>=100 do n:=abs((n div 100)*2 - (n mod 100))

Для 19:

while n>=100 do n:=(n div 100)*5 + (n mod 100)

Для 23:

while n>=300 do n:=(n div 300) + (n mod 300);
while n>=100 do n:=(n div 100)*8 + (n mod 100)

Для 29 та 31 робимо попереднє зменшення:

while n>=900 do n:=(n div 900) + (n mod 900)

Для 29:

while n>=200 do n:=abs((n div 200)*3 - (n mod 200));
n:=(n div 30)+(n mod 30);

Для 31:

while n>=100 do n:=(n div 100)*7 + (n mod 100)

Для 37:

while n>=1000 do n:=(n div 1000) + (n mod 1000);

Якщо в результаті вийшло трицифрове число без нулів, беремо найменшу з трьох цифр і віднімаємо її від кожної цифри цього числа.
Якщо отриманий результат — 37, 74, 370, 740, 407, 703, або 0, то число ділиться на 37.

Для 41:

while n>=900 do n:=abs((n div 900)*2 - (n mod 900));
while n>=200 do n:=abs((n div 200)*5 - (n mod 200));
while n>=40 do n:=abs((n div 40) - (n mod 40))

Для 43:

while n>=900 do n:=abs((n div 900)*3 - (n mod 900));
while n>=300 do n:=abs((n div 300) - (n mod 300));
while n>=40 do n:=abs((n div 40)*3 - (n mod 40))

(Пізніше напишу приклади, якщо матиму час та натхнення).