2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3, 4, 5
 
 Re: О возможности заменить программистов на ИИ
Сообщение16.06.2025, 22:37 
realeugene в сообщении #1690669 писал(а):
rockclimber в сообщении #1690667 писал(а):
Они никак не заменяют реляционные СУБД.
Во многих случаях заменяют.
Не в таких многих, чтобы я заметил. Я именно в этой области себе на жизнь зарабатываю, и пока не вижу никаких причин изучать все это. Скорее просто нашлась ниша, где SQL и ACID не нужны. Лет 10 назад была мода на форумах и хабре обсуждать вопросы "а давайте вместо этого вашего PostgreSQL/MySQL возьмем MongoDB - все то же самое, но SQL учить не надо". Как-то на нет сошла мода, насколько я могу судить.

 
 
 
 Re: О возможности заменить программистов на ИИ
Сообщение17.06.2025, 14:48 
Аватара пользователя
Вышел новый бенчмарк, LiveCodeBench Pro. Лучшие модели набирают 0%.

 
 
 
 Re: О возможности заменить программистов на ИИ
Сообщение18.06.2025, 12:16 
realeugene в сообщении #1689010 писал(а):
опыт работы на программистском конвейере очень быстро устаревает.
Конвеер вообще это не весело, как для работника.

 
 
 
 Re: О возможности заменить программистов на ИИ
Сообщение29.06.2025, 02:52 
В общем, потратил несколько часов выжимая из ИИ код который решает сравнение $n^2 = a \pmod{m}$ (находит все решения $n$ для данных $a$ и $m$ если они есть).
Впечатление от ИИ (я мучил DeepSeek) такое, что оно вроде бы и знает что надо делать, но ошибки делает очень тупые. Ну то есть оно знает про лемму Гензеля и тонкости поднятия корней, но не может правильно расставить открывающие и закрывающие скобки в коде, и путает запятые и точки с запятой.
Выяснилось, что проверить хотя бы компилируется код или нет, ИИ самостоятельно не может. Хотя уверенно заявляет что вот теперь-то код без ошибок и всё чики-поки. Запустить свой код в реальном интерпретаторе (чтобы проверить что код работает) ИИ тоже не может. В итоге всё сводится к долгой модификации и ловле багов "руками" самого ИИ ну и потом доводкой уже своими руками.
С другой стороны, в качестве интеллектуального усилителя вполне годится, так как результат-то налицо.

Да, я ещё пробовал ГигаЧат. В целом похоже на DeepSeek но заметно прям "слабее". ГигаЧат туповатый всетки. Примерно как Салют тупее Алисы (у меня обе колонки есть, могу сравнивать).

 
 
 
 Re: О возможности заменить программистов на ИИ
Сообщение29.06.2025, 03:07 
Аватара пользователя

(Вариант от Gemini)

код: [ скачать ] [ спрятать ]
Используется синтаксис Python
def solve_quadratic_congruence(a, m):
    """
    Находит все решения уравнения n^2 = a (mod m).

    Args:
        a (int): Остаток.
        m (int): Модуль.

    Returns:
        list: Отсортированный список всех уникальных решений n в диапазоне [0, m-1].
    """

    if m <= 1:
        return []

    a %= m
   
    # Разложение m на простые множители вида p^k
    prime_factorization = {}
    d = 2
    temp_m = m
    while d * d <= temp_m:
        while temp_m % d == 0:
            prime_factorization[d] = prime_factorization.get&#40;d, 0&#41; + 1
            temp_m //= d
        d += 1
    if temp_m > 1:
        prime_factorization[temp_m] = prime_factorization.get&#40;temp_m, 0&#41; + 1

    # Решения для каждого простого множителя p^k
    solutions_by_modulus = {}
    for p, k in prime_factorization.items&#40;&#41;:
        pk = p ** k
        solutions_by_modulus[pk] = _solve_for_prime_power&#40;a % pk, p, k&#41;
        if not solutions_by_modulus[pk]:
            # Если для одного из множителей нет решений, то и для m их нет
            return []

    # Комбинирование решений с помощью Китайской теоремы об остатках
   
    # Инициализация с решениями для первого множителя
    mods = list&#40;solutions_by_modulus.keys&#40;&#41;&#41;
    if not mods:
        return []
       
    current_solutions = solutions_by_modulus[mods[0]]
    current_mod = mods[0]

    # Постепенное комбинирование решений
    for i in range&#40;1, len&#40;mods&#41;&#41;:
        next_mod = mods[i]
        next_sols = solutions_by_modulus[next_mod]
       
        new_solutions = []
        for sol1 in current_solutions:
            for sol2 in next_sols:
                # Решаем систему x = sol1 &#40;mod current_mod&#41;, x = sol2 &#40;mod next_mod&#41;
                res, mod_res = _crt_pair&#40;sol1, current_mod, sol2, next_mod&#41;
                new_solutions.append&#40;res&#41;
       
        current_solutions = new_solutions
        current_mod *= next_mod
       
    return sorted&#40;list&#40;set&#40;current_solutions&#41;&#41;&#41;

def _solve_for_prime_power&#40;a, p, k&#41;:
    """Решает n^2 = a &#40;mod p^k&#41;."""
    if a == 0:
        # Для n^2 = 0 &#40;mod p^k&#41;, решения - это кратные p^ceil&#40;k/2&#41;
        ceil_k_div_2 = &#40;k + 1&#41; // 2
        root = pow&#40;p, ceil_k_div_2&#41;
        return list&#40;range&#40;0, pow&#40;p, k&#41;, root&#41;&#41;

    # Сначала решаем n^2 = a &#40;mod p&#41;
    base_sols = _solve_for_prime&#40;a % p, p&#41;
    if not base_sols:
        return []

    # Поднятие решений с mod p до mod p^k &#40;Лемма Гензеля&#41;
    pk = pow&#40;p, k&#41;
    all_sols = set&#40;&#41;

    for r in base_sols:
        # Если p делит 2r, но не p^k, то нужен специальный подход &#40;здесь для p=2&#41;
        if p == 2:
            sols = _lift_hensel_p2&#40;a, k, r&#41;
            all_sols.update&#40;sols&#41;
        else: # Для нечетных простых
             # f&#40;x&#41; = x^2 - a, f&#39;&#40;x&#41; = 2x
             # r_new = r - f&#40;r&#41; * &#40;f&#39;&#40;r&#41;&#41;^{-1} mod p^i
            current_r = r
            mod_p = p
            for _ in range&#40;1, k&#41;:
                f_r = &#40;current_r * current_r - a&#41;
                f_prime_r = 2 * current_r
               
                # Находим &#40;f&#39;&#40;r&#41;&#41;^{-1} mod p
                inv = _modInverse&#40;f_prime_r, p&#41;
               
                # t = &#40;f&#40;r&#41;/p^i&#41; * &#40;f&#39;&#40;r&#41;&#41;^{-1} mod p
                t = &#40;f_r // mod_p&#41; * inv
               
                # r_{i+1} = r_i - t * p^i
                current_r = &#40;current_r - t * mod_p&#41; % &#40;mod_p * p&#41;
                mod_p *= p
            all_sols.add&#40;current_r&#41;
   
    return sorted&#40;list&#40;all_sols&#41;&#41;

def _solve_for_prime&#40;a, p&#41;:
    """Решает n^2 = a &#40;mod p&#41; с помощью алгоритма Тонелли-Шенкса."""
    if p == 2:
        return [a % 2]
   
    # Проверка, является ли &#39;a&#39; квадратичным вычетом по модулю p
    if pow&#40;a, &#40;p - 1&#41; // 2, p&#41; != 1:
        return [] if a % p != 0 else [0]
   
    if a % p == 0:
        return [0]

    # Алгоритм Тонелли-Шенкса
    if p % 4 == 3:
        r = pow&#40;a, &#40;p + 1&#41; // 4, p&#41;
        return [r, p - r]

    # Разложение p-1 = Q * 2^S
    Q = p - 1
    S = 0
    while Q % 2 == 0:
        Q //= 2
        S += 1

    # Поиск неквадратичного вычета z
    z = 2
    while pow&#40;z, &#40;p - 1&#41; // 2, p&#41; == 1:
        z += 1

    M = S
    c = pow&#40;z, Q, p&#41;
    t = pow&#40;a, Q, p&#41;
    R = pow&#40;a, &#40;Q + 1&#41; // 2, p&#41;

    while t != 1:
        if t == 0:
            return [0]
        # Поиск i, такого что t^&#40;2^i&#41; = 1 &#40;mod p&#41;
        i = 0
        temp_t = t
        while temp_t != 1:
            temp_t = &#40;temp_t * temp_t&#41; % p
            i += 1
            if i == M: # Не должно случиться, если &#39;a&#39; - вычет
                return []
       
        b = pow&#40;c, pow&#40;2, M - i - 1, p - 1&#41;, p&#41;
        M = i
        c = &#40;b * b&#41; % p
        t = &#40;t * c&#41; % p
        R = &#40;R * b&#41; % p
   
    return [R, p - R]

def _lift_hensel_p2&#40;a, k, r_base&#41;:
    """Поднятие решений для p=2."""
    sols = {r_base}
    mod = 2
   
    for i in range&#40;1, k&#41;:
        new_sols = set&#40;&#41;
        mod_new = mod * 2
        for r in sols:
            if &#40;r*r - a&#41; % mod_new == 0:
                new_sols.add&#40;r&#41;
            if &#40;&#40;r+mod&#41;*&#40;r+mod&#41; - a&#41; % mod_new == 0:
                new_sols.add&#40;r + mod&#41;
        sols = new_sols
        mod = mod_new
    return list&#40;sols&#41;


def _extended_gcd&#40;a, b&#41;:
    """Расширенный алгоритм Евклида."""
    if a == 0:
        return b, 0, 1
    d, x1, y1 = _extended_gcd&#40;b % a, a&#41;
    x = y1 - &#40;b // a&#41; * x1
    y = x1
    return d, x, y

def _modInverse&#40;a, m&#41;:
    """Нахождение обратного по модулю."""
    d, x, y = _extended_gcd&#40;a, m&#41;
    if d != 1:
        # Обратный элемент не существует
        return None
    return &#40;x % m + m&#41; % m

def _crt_pair&#40;a1, m1, a2, m2&#41;:
    """Китайская теорема об остатках для двух уравнений."""
    d, n1, n2 = _extended_gcd&#40;m1, m2&#41;
    # x = a1 &#40;mod m1&#41;, x = a2 &#40;mod m2&#41;
    # Решение существует, если a1 = a2 &#40;mod gcd&#40;m1, m2&#41;&#41;
    if &#40;a1 - a2&#41; % d != 0:
        return None, None # Нет решений

    mod = m1 // d * m2
    k = &#40;a2 - a1&#41; // d
    x = a1 + k * n1 * m1
    return x % mod, mod

# --- Примеры использования ---
if __name__ == &#39;__main__&#39;:
    # Пример 1: n^2 = 1 &#40;mod 15&#41;
    # Решения: 1, 4, 11, 14
    a1, m1 = 1, 15
    solutions1 = solve_quadratic_congruence&#40;a1, m1&#41;
    print&#40;f"Решения для n^2 = {a1} &#40;mod {m1}&#41;: {solutions1}"&#41;

    # Пример 2: n^2 = 10 &#40;mod 13&#41;
    # Решения: 6, 7
    a2, m2 = 10, 13
    solutions2 = solve_quadratic_congruence&#40;a2, m2&#41;
    print&#40;f"Решения для n^2 = {a2} &#40;mod {m2}&#41;: {solutions2}"&#41;

    # Пример 3: n^2 = 5 &#40;mod 11&#41;
    # Решений нет
    a3, m3 = 5, 11
    solutions3 = solve_quadratic_congruence&#40;a3, m3&#41;
    print&#40;f"Решения для n^2 = {a3} &#40;mod {m3}&#41;: {solutions3}"&#41;

    # Пример 4: n^2 = 7 &#40;mod 32&#41;
    # Решений нет, так как n^2 = 7 &#40;mod 8&#41; не имеет решений
    a4, m4 = 7, 32
    solutions4 = solve_quadratic_congruence&#40;a4, m4&#41;
    print&#40;f"Решения для n^2 = {a4} &#40;mod {m4}&#41;: {solutions4}"&#41;

    # Пример 5: n^2 = 1 &#40;mod 8&#41;
    # Решения: 1, 3, 5, 7
    a5, m5 = 1, 8
    solutions5 = solve_quadratic_congruence&#40;a5, m5&#41;
    print&#40;f"Решения для n^2 = {a5} &#40;mod {m5}&#41;: {solutions5}"&#41;
   
    # Пример 6: n^2 = 71 &#40;mod 105&#41;
    # Решения: 16, 19, 86, 89
    a6, m6 = 71, 105
    solutions6 = solve_quadratic_congruence&#40;a6, m6&#41;
    print&#40;f"Решения для n^2 = {a6} &#40;mod {m6}&#41;: {solutions6}"&#41;

    # Пример 7: n^2 = 0 &#40;mod 100&#41;
    # Решения: 0, 10, 20, 30, 40, 50, 60, 70, 80, 90
    a7, m7 = 0, 100
    solutions7 = solve_quadratic_congruence&#40;a7, m7&#41;
    print&#40;f"Решения для n^2 = {a7} &#40;mod {m7}&#41;: {solutions7}"&#41;

Считает, вроде бы, правильно (правда ломается для случая $\operatorname{gcd}(a, m) > 1$). Решения в комментариях, что забавно, неправильные.

 
 
 
 Re: О возможности заменить программистов на ИИ
Сообщение29.06.2025, 03:30 
mihaild
Проверять надо на степенях двойки (чтобы она входила в 1..5 степенях), там в основном ошибки были у DeepSeek.
Ну и ещё я сделал так, чтобы вспомогательных функций не было, чтобы всё-в-одном. И на pari/gp
Питон-то дело такое... на питоне я пробовал попросить, так там нашлась библиотека с уже готовым подъемом Гензеля, неспортивно :mrgreen:

Проверьте на моём примере.
Gemini бесплатное? Надо б попробовать, что ли... Попросите кстати на pari сделать, справится оно?

 
 
 
 Re: О возможности заменить программистов на ИИ
Сообщение29.06.2025, 03:41 
Аватара пользователя
wrest в сообщении #1692757 писал(а):
Проверять надо на степенях двойки (чтобы она входила в 1..5 степенях)
Я проверил на всех парах $0 \leq a < m < 1000$.
wrest в сообщении #1692757 писал(а):
Питон-то дело такое... на питоне я пробовал попросить, так там нашлась библиотека с уже готовым подъемом Гензеля, неспортивно
Я попросил написать без использования нестандартных библиотек.
wrest в сообщении #1692757 писал(а):
Gemini бесплатное?
Это pro версия, к ней есть бесплатный доступ, но лимит низкий.

(pari/gp версия)

Код:
\\ Вспомогательная функция для решения n^2 = a (mod p^e)
\\ solve_sqmod_pe(a, p, e)
solve_sqmod_pe(a, p, e) =
{
    local(pe, vp_a, k, b, sols_y, pk_2, sols);
    pe = p^e;
    a = a % pe;

    if (a == 0,
        local(ce, pce);
        ce = ceil(e/2);
        pce = p^ce;
        return(vector(p^(e-ce), i, (i-1)*pce));
    );

    vp_a = valuation(a, p);
    if (vp_a > 0,
        if (vp_a % 2 != 0, return([])); \\ Нет решений, если степень p в a нечетна
        k = vp_a;
        b = a / p^k;
        pk_2 = p^(k/2);
        \\ Рекурсивный вызов для y^2 = b (mod p^(e-k)), где b взаимно просто с p
        sols_y = solve_sqmod_pe(b, p, e-k);
        return(vector(#sols_y, i, (sols_y[i] * pk_2) % pe));
    );

    \\ Случай, когда gcd(a,p) == 1
    if (p == 2,
        if (e == 1, if(a%2, return([1]), return([])));
        if (e == 2, if(a % 4 == 1, return([1, 3]), return([])));
        \\ e >= 3
        if (a % 8 != 1, return([]));

        local(s);
        \\ Находим одно решение, используя лемму Гензеля для p=2
        s = 1;
        for (k = 3, e-1,
            if (((s^2 - a) / 2^k) % 2,
                s = s + 2^(k-1);
            );
        );
        s = s % pe;

        \\ Находим остальные 3 решения
        local(s2, res);
        s2 = -s % pe;
        res = [s, s2, (s + 2^(e-1)) % pe, (s2 + 2^(e-1)) % pe];
        return(Vec(Set(res)));
    ,
        \\ Случай, когда p - нечетное простое
        if (kronecker(a, p) != 1, return([]));
        local(s);
        s = sqrtmod(a, pe); \\ Эффективная встроенная функция
        if (s == -s % pe, return([s]), return([s, -s % pe]));
    );
}


\\ Основная функция для решения n^2 = a (mod m)
\\ solve_all_sqmod(a, m)
solve_all_sqmod(a, m) =
{
    local(F, all_sols_per_factor, moduli);

    if (m <= 0, error("Модуль должен быть положительным"));
    if (m == 1, return([0]));

    a = a % m;
    F = factor(m);

    all_sols_per_factor = vector(matsize(F)[1]);
    moduli = vector(matsize(F)[1]);

    \\ Шаг 1: Решить n^2 = a (mod p^e) для каждого простого множителя p
    for (i = 1, matsize(F)[1],
        local(p, e, pe, sols_pe);
        p = F[i, 1];
        e = F[i, 2];
        pe = p^e;
        moduli[i] = pe;

        sols_pe = solve_sqmod_pe(a, p, e);

        if (#sols_pe == 0,
            return([]); \\ Если для одного множителя нет решений, то и в целом их нет
        );
        all_sols_per_factor[i] = sols_pe;
    );

    \\ Шаг 2: Комбинировать решения с помощью Китайской теоремы об остатках
    local(num_factors, counts, total_sols, final_sols, indices, k, j);
    num_factors = #all_sols_per_factor;
    counts = vector(num_factors, i, #all_sols_per_factor[i]);
    total_sols = prod(i=1, num_factors, counts[i]);

    if (total_sols == 0, return([]));

    final_sols = vector(total_sols);
    indices = vector(num_factors, i, 1); \\ 1-based indices

    for (k = 1, total_sols,
        local(congruences);
        congruences = vector(num_factors, i, all_sols_per_factor[i][indices[i]]);
        final_sols[k] = chinese(Mod(congruences, moduli));

        \\ "Одометр": инкрементируем индексы для получения следующей комбинации
        j = num_factors;
        while (j > 0,
            indices[j]++;
            if (indices[j] <= counts[j], break);
            indices[j] = 1;
            j--;
        );
    );

    return(vecsort(final_sols));
}

 
 
 
 Re: О возможности заменить программистов на ИИ
Сообщение29.06.2025, 10:36 
mihaild
Код для pari/gp не рабочий. Но в нём хотя бы баланс скобок нормальный. :D
А нерабочий он потому, что Gemini привиделась несуществующая в pari/gp встроенная функция sqrtmod() которая якобы ищет решение по модулю в том числе являющемуся степенью простого числа. Так в том-то и "мякотка" задачи что эту часть надо писать самому :mrgreen:
У DeepSeek и GigaChat тоже такие глюки были. Кому-то из них, кажись, привиделась и несуществующая встроенная функция henselshift(). Соответственно, DeepSeek-у пришлось писать код подъема корней по лемме Гензеля "руками" - с вычислением производных и т.п. Как раз на эти 30 строк код DeepSeek и длиннее. Дальше вероятно Gemini бы ожидал сюрприз с функцией chinese() применяющей КТО ибо судя по коду вызывается она не так как надо (но это не точно).

Вот тут бы конечно и помог доступ ИИ к реальному интерпретатору, т.к. в целом тот же DeepSeek вполне четко "понимал" где проблема в коде по скармливаемым ему ошибкам компиляции и затем ошибкам запуска и затем ошибочным результатам (например пустым, неполным или просто ошибочным).

Но даже со всеми этими нюансами, меня успехи ИИ впечатляют.

 
 
 
 Re: О возможности заменить программистов на ИИ
Сообщение30.06.2025, 16:13 
Видимо pari/gp слишком редкое знание для ИИ. Мне так и не удалось добиться от бесплатного ChatGPT подсказки, как посчитать целочисленный факториал. Зато фантазий про разные встроенные функции и типы, которых и близко нет в системе, были тонны. Про восклицательный знак просто в конце концов нагуглил в каком-то читшите.

 
 
 
 Re: О возможности заменить программистов на ИИ
Сообщение30.06.2025, 16:20 
Аватара пользователя
У меня сложилось впечатление, что для любого ИИ-агента любое знание слишком редкое, если оно относится к продукту, используемому менее чем десятью миллиардами программистов.
По какому-нибудь Python'у или vue.js там будет всё, что на этих платформах написано, причём с очень качественными аннотациями (наверное; но это потому, что конкретно с вашей проблемой там уже столкнулось человек двадцать и написали пять качественных решений).
По моему родному Delphi, даже по очень популярной библиотеке TeeChart — пшик и пафосные галлюцинации.

 
 
 [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3, 4, 5


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group