Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 131 След.
Теорема Ферма, Доказательство Теоремы Ферма
 
Цитата
MCH написал:
ничего дополнительно не подключали?
в Python целочисленная арифметика по умолчанию - длинная.
Все целочисленные операции: +, -, *, // (целочисленное деление), ** (степень), % (остаток от деления) - производятся с длинными числами, не ограниченными по количеству знаков, ничего подключать не нужно.

Обычно длинка работает достаточно быстро, т.к. реализована на C++, сравнивал с вычислениями на dotNet (в частности PascalABC.NET), Python большие числа Фибоначчи рассчитал значительно быстрее, чем BigInteger в PascalABC
Теорема Ферма, Доказательство Теоремы Ферма
 
Ну и проверка данной "шутки" в Python:
Код
print(24576 ** 4 + 48767 ** 4 - 49535 ** 4)

результат:3072
Теорема Ферма, Доказательство Теоремы Ферма
 
Решение на Python в пару строчек:
Код
a, b, c, n = 3987, 4365, 4472, 12
print(f'a^n: {a**n}', f'b^n: {b**n}', f'c^n: {c**n}', f'a^n + b^n: {a**n + b**n}', f'a^n + b^n - c^n: {a**n + b**n - c**n}', sep='\n')

Результат:
Код
a^n: 16134474609751291283496491970515151715346481
b^n: 47842181739947321332739738982639336181640625
c^n: 63976656348486725806862358322168575784124416
a^n + b^n: 63976656349698612616236230953154487896987106
a^n + b^n - c^n: 1211886809373872630985912112862690
Изменено: MCH - 13.11.2023 13:11:12
Alisa GPT пишет свой первый макрос
 
Цитата
Бахтиёр написал:
видать намного умнее чем Алиса
Задал идентичный вопрос Алисе, получил точно такой же ответ, возможно Алиса переспрашивает у Chat GPT
Скрытый текст
Преобразование числа в буквы и обратно, Convert number to letters and back
 
А если сразу генерировать буквенно-цифровую строку из 10  символов, должно быть быстрее, а уникальность определяется огромным числом вариантов (но не гарантируется), если нужно, то можно обратно в число преобразовать
Равномерно распределить массив чисел
 
678, 804, 133, 114, остальное единицы - расчет зависает
Вычисление больших чисел
 
В зависимости от задач можно предложить:
1. Написать собственную UDF на VBA для расчета больших чисел
2. Использовать сторонние библиотеки, которые позволяют вычислять в Excel
https://www.cyberforum.ru/blogs/829006/blog5196.html
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=102871

3. Другой язык программирования с реализованной длинной арифметикой (Python, Java, C# и др.)
Изменено: MCH - 29.06.2023 12:18:36
Как рассчитать N-раз от даты и дня недели по определенным дням, отсчет от даты по конкретным дням
 
Цитата
koshak_pp написал:
формула перестаёт работать,
Формула массива вводится нажатием Ctrl+Shift+Enter
Как рассчитать N-раз от даты и дня недели по определенным дням, отсчет от даты по конкретным дням
 
Цитата
Сергей написал:
Соотв если менять кол-ва посещений и дату первой оплаты все предложенные формулы могут привести к разным результатам
Вы мою формулу из 6го сообщения смотрели, она достаточно универсальна, выходные и рабочие дни задаются строкой "0101000", где 0 - выходной, 1 - рабочий день.
Будут другие условия, формулу легко поправить.
Формула должна корректно вычислять любой график работы в горизонте ближайших - 98 дней (можно исправить на нужный)

И да, формула медленная и постоянна пересчитывается, что дает свои ограничения, по сравнению с математическими формулами.
Изменено: MCH - 21.06.2023 16:36:19
Как рассчитать N-раз от даты и дня недели по определенным дням, отсчет от даты по конкретным дням
 
Вариант, формула массива
Равномерно распределить массив чисел
 
Jack Famous, алгоритм зависит от задачи
Если слагаемых мало - даже перебор подойдет
Если искомая сумма небольшая - динамическое программирование
Если нет жесткого требования к оптимальности результата - жадный алгоритмы с частичными переборами с оптимизациями и отсечениями неперспективных ветвей решения используя эвристики
Можно линейное программирование прикрутить

Код Игоря считает быстро, когда решение точно есть, я пока не разобрался в алгоритме
Равномерно распределить массив чисел
 
Цитата
MCH написал:
поизучаю алгоритм
Пока с алгоритмом до конца не разобрался
Вижу перебор но с отсечением (как бы используем метод ветвей и границ), как только находим результат, останавливаем решение
Возможно ошибаюсь

Если поменять тип переменных с Variant на Long и Double, то можно еще немного ускорить
Что заметил, если точного решения нет (если нельзя ровно разделить на два равных по сумме списка) то расчет уходит в долгую
Например, первое число 999, второе число 1001 и далее 198 двоек
Разделить данный список на два равных по сумме невозможно, можно в одном списке 999 + 99*2, в другом 1001 + 99 *2 (или 999 + 100*2 и 1001 + 98*2), что динамикой решается очень быстро
Изменено: MCH - 16.06.2023 11:01:02
Равномерно распределить массив чисел
 
Ігор Гончаренко, Время работы впечатляет, поизучаю алгоритм
Равномерно распределить массив чисел
 
Цитата
Alien Sphinx написал:
Отработал на 20 числах. Тестировал и 30, но ушел в ошибку run out of memory
Протестировал свой код на 200 чисел (код не менял, добавил случайные данные), общая сумма для поиска - 13 млн, отработал не очень быстро но за разумное время.
Скорость решения и выделяемая память больше зависит от величины искомой суммы, и линейно зависит от количества слагаемых
Сложность алгоритма O(s * n), где s - искомая сумма, n - количество слагаемых, выделяемая память O(s)
Изменено: MCH - 15.06.2023 17:00:35
Равномерно распределить массив чисел
 
Сведение задачи к решению к "Задачи сумма подмножеств"
В первый список помещаем все слагаемые которые дают сумму не более половины общей суммы, во второй список - все остальные слагаемые

На базе решения динамическим программированием:
Количество слагаемых может быть большим (несколько сотен - легко)
Может работать с суммами с копейками
Для каждого слагаемого указывается количество данных слагаемых

Суммы распределяет максимально равномерно, если это возможно, но по количеству слагаемых списки могут различаться и не быть равномерными
Если нужно и количество слагаемых распределить примерно поровну, то можно реализовать другой алгоритм
Изменено: MCH - 15.06.2023 15:18:40
Комбинаторика: составить уникальные комбинации элементов массива
 
Нужны все перестановки:
9 5 2
9 2 5
5 9 2
5 2 9
2 9 5
2 5 9
или что-то другое?
VBA. Распределение паллет
 
Пришлите на почту из профиля или выложите здесь пример исходных данных
Озвучьте бюджет проекта.

На вскидку обычный рюкзак с двумя ограничениями (по весу и по кол-ву), возможно подойдет решение задачи "сумма подмножеств" и ее вариации. Алгоритмы аналогичные как в "задаче упаковки в контейнеры" (Bin packing problem) / "задача раскроя" (Cutting stock problem)
В зависимости от исходных данных и их кол-ва можно будет решить оптимально с помощью линейного программирования.
Изменено: MCH - 08.06.2023 09:09:24
Расположение товара на паллете, Зная длину и ширину оптимально разместить товар на паллете
 
В рамках текущего набора данных можно распределить все товары на 6 паллет
При этом паллеты будут высотой от 1500 до 1650 мм
Монопаллет (с одним товаром) будет только один
Остальные можно распределить - не более трех различных товаров на паллете
в двух - трех паллетах верхний ряд будет сборный

На сколько является важным потратить много времени на расчет укладки  и уложить товар на 6 паллет или допустимо раскидать по быстрому весь товар на 7 паллет, где будет 2 или 3 монопаллета, остальное распределено жадным алгоритмом без явной оптимизации?
Расположение товара на паллете, Зная длину и ширину оптимально разместить товар на паллете
 
Исходя из информации из предыдущего сообщения, то указанный объем можно разместить на 6ти паллетах 800х1200х1650
Для этого нужно еще ограничения: сколько разных товаров может быть на паллете (скорее всего предпочтительно один товар на паллете и минимизация сборных паллет)
В теории, если сложить все объемы товаров и разделить на максимальный объем паллета (800х1200х1650) то получается 4,999... паллет, т.е. в 5 паллет точно не поместится, т.к. при укладке есть потери пространства.
Изменено: MCH - 30.05.2023 17:32:37
Расположение товара на паллете, Зная длину и ширину оптимально разместить товар на паллете
 
Задача укладка на паллет относится к 3D укаладке и в общем случае достаточно сложная. можно ее упростить и решать задачу 2D укладки каждого товара по слоям
Можно использовать следующий алгоритм:
1. объединяем схожие размеры товаров
2. раскладываем каждый вид товара на паллет в один слой, для этого используем 2D раскладку с возможностью вращения коробок (см. вложение)
3. раскладываем полученные карты раскладки на целые палеты с учетом ограничения по высоте паллета, при этом можно объединять разные слои товаров, если это приводит к уменьшению количества целых паллет. Возможно нужно еще вводить ограничение по весу паллета, т.к. он обычно регламентируется.
4. то что не влезает в паллет размещаем на сборных паллетах, либо в ручную либо частично автоматизируем процесс.

Пример 2D укладки во вложении.
Если задачи разовые, то можно использовать данный калькулятор как помощник для определения оптимальной укладки коробок по слоям, если задача регулярная и объемная, то нужно реализовывать нормальный алгоритм раскладки. На первом этапе может подойти даже жадный алгоритм, далее нужно применить генерацию оптимальных схем раскладки и с помощью линейного программирования (симплекс метода) определять минимальное кол-во паллет.
Подгонка до нужного числа
 
Дополнил решение, сделал второй вариант (изменение кол-ва):
1. Пропорционально меняем количество под нужную сумму
2. Цены не меняем (округляем до нужной точности)
3. Подгоняем цены, меняя некоторые позиции в ценах (+/- несколько копеек)
Подгонка до нужного числа
 
Решение отсюда: https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=142792
Меняйте значение в D2 и смотрите результат
Изменено: MCH - 22.05.2023 08:23:38
Получить все бинарные числа для заданного количества знаков, Get Binary values for target LenNum
 
Цитата
Jack Famous написал:
только непонятно, как это делать
Пример разложения числа на биты через остаток от деления на 2
Генерируем 10 случайных чисел от 0 до 65535 с выводом их битов

Код
Function get_bits(ByVal n As Long, nums As Long) As Long()
    Dim i As Long
    Dim out_array() As Long
    ReDim out_array(nums - 1) As Long
    While n > 0 And i < nums
        out_array(i) = n Mod 2
        n = n \ 2
        i = i + 1
    Wend
    get_bits = out_array()
End Function

Sub print_array(a() As Long)
    Dim x As Variant
    For Each x In a
        Debug.Print x;
    Next x
    Debug.Print
End Sub

Sub test()
    Dim a() As Long, n As Long, i As Long
    For i = 1 To 10
        n = Int(Rnd * 256 * 256)
        a = get_bits(n, 16)
        Debug.Print n,
        print_array a()
    Next i
End Sub


Биты числа в обратном порядке при выводе, нумерация битов в массиве от 0 до nums-1

То что я имел в виду:
разложение целого числа на биты по затратам сопоставимо с разложением десятичного числа на разряды, где каждая цифра может быть либо 0 либо 1, при этом охватываемый диапазон числе с побитным представлением для типа Long - 31 бит
Получить все бинарные числа для заданного количества знаков, Get Binary values for target LenNum
 
Цитата
Ігор Гончаренко написал:
потом чтобы этими ноликами/единичками воспользоваться - нужно каждое значение снова разобрать на 0 / 1в общем - такая себе идея с сомнительным итоговым результатом
Думаю, что по скорости десятки разбирать (при делении на 10), что биты (при делении на 2) будет сопоставимо, только зачем в итоге разделять на десятки, когда можно с битами работать?

самый простой способ получить все варианты с битами: for i = 1 to 2 ^ d - 1
Ограничение для типа Long - 31 бит, это 2 млрд. комбинаций (их еще и перебрать нужно)
Разделение числа на биты аналогично разделению десятичного числа состоящего из цифр 1 и 0 на разряды, а может и быстрее
Изменено: MCH - 12.05.2023 14:58:24
Получить все бинарные числа для заданного количества знаков, Get Binary values for target LenNum
 
Поправил процедуру Игоря, скорость не измерял
Код
Sub Digist01(a() As Double, d As Long)
    Dim i As Long, j As Long, k As Long, t As Long
    ReDim a(2 ^ d - 1) As Double
    i = 1
    k = 1
    
    For t = 1 To d
        For j = 0 To i - 1
            a(i + j) = k + a(j)
        Next j
        i = i * 2
        k = k * 10
    Next t
End Sub
Оптимальный распил досок с наименьшим количеством обрезков.
 
Цитата
александр Ишора написал:
странно, почему Вы не выложили веб версию
Для этого нужно стать Fullstack-разработчиком, возможно это следующий этап моего развития
Для себя вижу связку Python + Django (Backend) и React (Frontend)
Вопрос в мотивации, для чего это мне нужно?
Оптимальный распил досок с наименьшим количеством обрезков.
 
Цитата
александр Ишора написал:
Нашел на просторах вот такой Файл эксель,  
Чем не устраивает решение? Особенно для "дачников" оно хорошо подойдет
Если качество раскроя не устраивает, то можно решить и бесплатной реализацией из ссылки, которую предоставили выше
Пример раскроя во вложении на основе данных из первого поста, исходный рабочий файл можно скачать на excelworld


Цитата
александр Ишора написал:
Вот скажите, такой файл было трудно сделать?
В Вашем файле код VBA открыт, зайдите в редактор VBA и посмотрите, на сколько трудоемко было сделать


PS: Где взяли файл? (Файл не имеет защиты кода VBA, а я точно помню, что выкладывал с паролем)
PPS: в демоверсии нет оптимизированных алгоритмов расчета, поэтому может считать медленно или не очень качественно.
Изменено: MCH - 11.05.2023 11:56:46
Рассчитать % премии по заданной шкале
 
Добавлю свой вариант:
Код
=ЕСЛИ(A2<0,85;0;ЕСЛИ(A2<1;ПРЕДСКАЗ(A2;{0,5:1};{0,85:1});МИН(ПРЕДСКАЗ(A2;{1:1,5};{1:1,1});1,5)))
Получить все бинарные числа для заданного количества знаков, Get Binary values for target LenNum
 
По алгоритму это похоже на динамическое программирование, когда получаем новые данный на базе уже ранее вычисленных и сохраненных в массиве.
Алгоритм относительно быстрый но требует очень много памяти, например, уже для 30 значений не хватит памяти, а это всего лишь 1млрд комбинаций.
Можно реализовать алгоритм, который вычисляет каждое значение на основе предыдущего состояния (как бы итератор), памяти будет затрачено значительно меньше, но вычисления будут отнимать время.
Комбинаторика. Метод перестановок. Получить все перестановки элементов одномерного массива, Combinatorics. Permutation method. Get all Permutations of 1D-Array
 
На вскидку получается размещения из 3 по 1 (3 варианта)  плюс размещения из 3 по 2 (6 вариантов) и плюс размещения из 3 по 3 (6 вариантов)
Можно использовать генерацию размещений (любой из алгоритмов) последовательно перебирая выборку от 1 до n
Можно сделать бинарный перебор (для 3х чисел - от 1 до 7: 001, 010, 011, 100, 101, 110, 111), где 1 - есть значение в выборке, 0 - отсутствует значение в выборке, далее к каждой выборке применить перестановки, тогда будут сгенерированы все возможные сочетания с перестановками

Размещение из n по k:
Допустим есть 3 значения (n = 3): 1, 2, 3
Размещения 2х элементов (k = 2): 12, 21, 13, 31, 23, 32

Как можно реализовать задачу используя текущие реализации функций:
Цикл k от 1 до n
Запускаем перебор сочетаний из n по k (k=1: 1,2,3; k=2: 12, 13, 23; k=3: 123)
Для каждого сочетания запускаем перестановки
Получаем желаемый результат

при k = n будут просто все перестановки
как и было в состоянии "Есть"
Изменено: MCH - 04.05.2023 14:20:16
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 131 След.
Наверх