1

Тема: Біноміальні коефіцієнти

а ну напиши програму обчислення біноміального коефіціенту і подивимося на шо твій го здатний

2 Востаннє редагувалося tchort (05.12.2020 22:46:06)

Re: Біноміальні коефіцієнти

ur_naz написав:

а ну напиши програму обчислення біноміального коефіціенту і подивимося на шо твій го здатний

Навіщо мені щось подібне робити? Навіщо особі що тільки вчить програмування щось подібне?
Не буду нічого подібного робити - я тут не для того аби продавати якусь мову. Ні для того щоб виконувати платні чи безоплатні замовлення від якогось аноніму.
Коли ви бажаєте провести аналіз - "якою мовою, з тих які ви знаєте, легше всього написати Б.К." та скласти про це доповідь - прошу створити для цього окрему тему.

3

Re: Біноміальні коефіцієнти

ur_naz написав:

а ну напиши програму обчислення біноміального коефіціенту і подивимося на шо твій го здатний

Моя перша програма на Go:

package main

import (
    "math/big"
    "github.com/soniakeys/integer/binomial"
    "fmt"
)

func main() {
    var combs big.Int
    binomial.Binomial(&combs, 8, 3)
    fmt.Println(combs.String())
}
Подякували: tchort, P.Y.2

4

Re: Біноміальні коефіцієнти

Для порівняння - Rust.

extern crate num_integer;

fn main() {
    println!("{}", num_integer::binomial(8,3));
}

Щоправда, ще в cargo.toml треба додати в [dependencies]

num-integer = "*"

ur_naz, а тепер ви, своєю улюбленою мовою програмування?

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

5

Re: Біноміальні коефіцієнти

Схоже, на цьому можна знаходити біноміальні коефіцієнти, не знаючи, що це таке, взагалі :)

Подякували: koala, tchort2

6

Re: Біноміальні коефіцієнти

дуже круто, але це не працює в жодному онлайн інтерпретаторі. Тому незалік. Ще будуть спроби?
До того ж С_8_3 можна без будь якого програмування обчислити

7 Востаннє редагувалося tchort (06.12.2020 02:31:13)

Re: Біноміальні коефіцієнти

Прихований текст
ur_naz написав:

дуже круто, але це не працює в жодному онлайн інтерпретаторі. Тому незалік. Ще будуть спроби?
До того ж С_8_3 можна без будь якого програмування обчислити

Якого це має клятого відношення до моєї теми? Покиньте кімнату.

8

Re: Біноміальні коефіцієнти

ur_naz написав:

дуже круто, але це не працює в жодному онлайн інтерпретаторі. Тому незалік. Ще будуть спроби?
До того ж С_8_3 можна без будь якого програмування обчислити

Скільки можна казати - спершу вивчить щось, а потім кажіть "не працює". Ось вам C3180 у рідних пісочницях, усе працює.
https://play.golang.org/p/CRqrZO_Ryi1
https://play.rust-lang.org/?version=sta … d48e6e6887

Подякували: tchort1

9

Re: Біноміальні коефіцієнти

31 80 ви дражнитесь? які наступні будуть? 250 125?  *FACEPALM*

10

Re: Біноміальні коефіцієнти

ur_naz написав:

31 80 ви дражнитесь? які наступні будуть? 250 125?  *FACEPALM*

У вас із цими числами якісь негативні спогади пов'язані, чи що? В чому проблема? Просто хотів великий результат отримати, за межами 4 байтів. Вам 23 десяткових цифр замало? А скільки треба? І ви власний код покажете, нарешті, чи лише вигадувати закиди до чужого коду виходить?

11 Востаннє редагувалося ur_naz (06.12.2020 03:38:40)

Re: Біноміальні коефіцієнти

а це я так розумію код реалізації...

// Copyright 2012 Peter Luschny, Sonia Keys
// License MIT: http://www.opensource.org/licenses/MIT

// Package binomial computes binomial coefficients C(n,k)
// with an efficient algorithm using prime numbers.
package binomial

import (
    "math/big"

    "github.com/soniakeys/integer/prime/sieve"
    "github.com/soniakeys/integer/xmath"
)

// Binomal computes the binomial coefficient C(n,k) leaving the result in z.
// It replaces the existing value of z and returns z.
func Binomial(z *big.Int, n, k uint) *big.Int {
    if k > n {
        return z.SetInt64(0)
    }
    return BinomialS(z, sieve.New(uint64(n)), n, k)
}

// BinomialS computes the binomial coefficient C(n,k) using prime number
// sieve p.  BinomialS returns nil if p is too small.  Otherwise it leaves
// the result in z, replacing the existing value of z, and returning z.
func BinomialS(z *big.Int, p *sieve.Sieve, n, k uint) *big.Int {
    if uint64(n) > p.Lim {
        return nil
    }
    if k > n {
        return z.SetInt64(0)
    }
    if k > n/2 {
        k = n - k
    }
    if k < 3 {
        switch k {
        case 0:
            return z.SetInt64(1)
        case 1:
            return z.SetInt64(int64(n))
        case 2:
            var n1 big.Int
            return z.Rsh(z.Mul(z.SetInt64(int64(n)), n1.SetInt64(int64(n-1))), 1)
        }
    }
    rootN := uint64(xmath.FloorSqrt(n))
    var factors []uint64
    p.Iterate(2, rootN, func(p uint64) (terminate bool) {
        var r, nn, kk uint64 = 0, uint64(n), uint64(k)
        for nn > 0 {
            if nn%p < kk%p+r {
                r = 1
                factors = append(factors, p)
            } else {
                r = 0
            }
            nn /= p
            kk /= p
        }
        return
    })
    p.Iterate(rootN+1, uint64(n/2), func(p uint64) (terminate bool) {
        if uint64(n)%p < uint64(k)%p {
            factors = append(factors, p)
        }
        return
    })
    p.Iterate(uint64(n-k+1), uint64(n), func(p uint64) (terminate bool) {
        factors = append(factors, p)
        return
    })
    return xmath.Product(z, factors)
}

смішно, на пітоні реалізація вкладається в 6 рядків, а рішення на Rust, має обмеження незважаючи на використання типу BigInt

До того ж тут не обговорення пакетів і бібліотек...

12

Re: Біноміальні коефіцієнти

Це не Rust, а Go.
На пайтоні вкладається взагалі в два рядки, перший з яких import scipy.stats.
Звісно, всередині там будуть C, і так само страшні. Бо ваше рішення в 6 рядків буде шукати С250125 кілька хвилин.
А вашу нездатність написати код я врахую.

Подякували: tchort, leofun012

13 Востаннє редагувалося tchort (06.12.2020 11:35:27)

Re: Біноміальні коефіцієнти

До того ж тут не обговорення пакетів і бібліотек...

Нечувано. І звідки це вам знати обговорення чого саме тут має відбуватися? Ви продемонстрували свою неспосібність до сприйняття контексту як і

вашу нездатність написати код

.
*Автор цієї теми відписався від неї і поки не має терпіння на неї. Причина: забагато  офтопу.

14

Re: Біноміальні коефіцієнти

Прихований текст

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

15

Re: Біноміальні коефіцієнти

APL (можна потестувати тут):
функція:

      binomial←{(⍺⍣{2+/0,⍵,0},1)[⍵]}

її використання:

      8 binomial 3
56
      81 binomial 30
1.4089890496511308e+22
      80 binomial 31
1.4308729894903956e+22
      250 binomial 125
9.120836692818573e+73

Усе правильно ніби?

16

Re: Біноміальні коефіцієнти

Кілька хвилин... смішно

91208366928185711600087718663295946582847985411225264672245111235434562752
Time to process:
0.0

17

Re: Біноміальні коефіцієнти

P.Y.,
по-перше, нічого не зрозуміло. гарна мова повинна бути зрозуміла для початківця.
по-друге, це рішення має обмеження розміром дабла. тобто, це навіть гірше за пітон.

18

Re: Біноміальні коефіцієнти

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

Обмеження точності та розміру — від конкретної реалізації залежить. Та, яку я навів, базується на JS і використовує той же числовий тип, що й JS. Зауважу, безрозмірні цілі числа, якими оперує python, властиві далеко не всім мовам — з широко відомих, це хіба що LISP, частіше ж або зовсім нема, або десь глибоко в додаткових бібліотеках.

19 Востаннє редагувалося ur_naz (06.12.2020 15:48:47)

Re: Біноміальні коефіцієнти

обчислення за допомоги трикутника Паскаля має складність О(н2), є методи які обчислюють за О(н)
Так, не всім мовам. І чи не особливості мов, ми тут обговорюємо. Бо якщо подивитись по вакансіях то топ 3 - нет пхп і жаба. І доречи, тенденція по вакансіях дуже схожа для всіх мов. після квітневого зевіздецю, зараз відбувається зростання, але чи надовго?

20

Re: Біноміальні коефіцієнти

Телепатично вкрадений код від ur_naz:

def binomial(k,n):
    return 91208366928185711600087718663295946582847985411225264672245111235434562752
Подякували: tchort1