C#,数值计算——多项式微分(Binomial Deviates)的计算方法与源程序

news2024/12/29 3:16:03

1 文本格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// 二项式偏差
    /// Binomial Deviates
    /// </summary>
    public class Binomialdev : Ran
    {
        private double pp { get; set; }
        private double p { get; set; }
        private double pb { get; set; }
        private double expnp { get; set; }
        private double np { get; set; }
        private double glnp { get; set; }
        private double plog { get; set; }
        private double pclog { get; set; }
        private double sq { get; set; }
        private int n { get; set; }
        private int swch { get; set; }
        private ulong uz { get; set; }
        private ulong uo { get; set; }
        private ulong unfin { get; set; }
        private ulong diff { get; set; }
        private ulong rltp { get; set; }
        private int[] pbits { get; set; } = new int[5];
        private double[] cdf { get; set; } = new double[64];
        private double[] logfact { get; set; } = new double[1024];

        public Binomialdev(int nn, double ppp, ulong i) : base(i)
        {
            this.pp = ppp;
            this.n = nn;
            pb = p = (pp <= 0.5 ? pp : 1.0 - pp);
            if (n <= 64)
            {
                uz = 0;
                uo = 0xffffffffffffffffL;
                rltp = 0;
                for (int j = 0; j < 5; j++)
                {
                    pbits[j] = 1 & ((int)(pb *= 2.0));
                }
                pb -= Math.Floor(pb);
                swch = 0;
            }
            else if (n * p < 30.0)
            {
                cdf[0] = Math.Exp(n * Math.Log(1 - p));
                for (int j = 1; j < 64; j++)
                {
                    cdf[j] = cdf[j - 1] + Math.Exp(Globals.gammln(n + 1.0) - Globals.gammln(j + 1.0) - Globals.gammln(n - j + 1.0) + j * Math.Log(p) + (n - j) * Math.Log(1.0 - p));
                }
                swch = 1;
            }
            else
            {
                np = n * p;
                glnp = Globals.gammln(n + 1.0);
                plog = Math.Log(p);
                pclog = Math.Log(1.0 - p);
                sq = Math.Sqrt(np * (1.0 - p));
                if (n < 1024)
                {
                    for (int j = 0; j <= n; j++)
                    {
                        logfact[j] = Globals.gammln(j + 1.0);
                    }
                }
                swch = 2;
            }
        }

        public int dev()
        {
            int k;
            if (swch == 0)
            {
                unfin = uo;
                for (int j = 0; j < 5; j++)
                {
                    diff = unfin & (int64() ^ (pbits[j] > 0 ? uo : uz));
                    if (pbits[j] > 0)
                    {
                        rltp |= diff;
                    }
                    else
                    {
                        rltp = rltp & ~diff;
                    }
                    unfin = unfin & ~diff;
                }
                k = 0;
                for (int j = 0; j < n; j++)
                {
                    if ((unfin & 1) > 0)
                    {
                        if (doub() < pb)
                        {
                            ++k;
                        }
                    }
                    else
                    {
                        if ((rltp & 1) > 0)
                        {
                            ++k;
                        }
                    }
                    unfin >>= 1;
                    rltp >>= 1;
                }
            }
            else if (swch == 1)
            {
                double y = doub();
                int kl = -1;
                k = 64;
                while (k - kl > 1)
                {
                    int km = (kl + k) / 2;
                    if (y < cdf[km])
                    {
                        k = km;
                    }
                    else
                    {
                        kl = km;
                    }
                }
            }
            else
            {
                for (; ; )
                {
                    double u = 0.645 * doub();
                    double v = -0.63 + 1.25 * doub();
                    double v2 = Globals.SQR(v);
                    if (v >= 0.0)
                    {
                        if (v2 > 6.5 * u * (0.645 - u) * (u + 0.2))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        if (v2 > 8.4 * u * (0.645 - u) * (u + 0.1))
                        {
                            continue;
                        }
                    }
                    k = (int)(Math.Floor(sq * (v / u) + np + 0.5));
                    if (k < 0 || k > n)
                    {
                        continue;
                    }
                    double u2 = Globals.SQR(u);
                    if (v >= 0.0)
                    {
                        if (v2 < 12.25 * u2 * (0.615 - u) * (0.92 - u))
                        {
                            break;
                        }
                    }
                    else
                    {
                        if (v2 < 7.84 * u2 * (0.615 - u) * (1.2 - u))
                        {
                            break;
                        }
                    }
                    double b = sq * Math.Exp(glnp + k * plog + (n - k) * pclog - (n < 1024 ? logfact[k] + logfact[n - k] : Globals.gammln(k + 1.0) + Globals.gammln(n - k + 1.0)));
                    if (u2 < b)
                    {
                        break;
                    }
                }
            }
            if (p != pp)
            {
                k = n - k;
            }
            return k;
        }
    }
}
 

2 代码格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// 二项式偏差
    /// Binomial Deviates
    /// </summary>
    public class Binomialdev : Ran
    {
        private double pp { get; set; }
        private double p { get; set; }
        private double pb { get; set; }
        private double expnp { get; set; }
        private double np { get; set; }
        private double glnp { get; set; }
        private double plog { get; set; }
        private double pclog { get; set; }
        private double sq { get; set; }
        private int n { get; set; }
        private int swch { get; set; }
        private ulong uz { get; set; }
        private ulong uo { get; set; }
        private ulong unfin { get; set; }
        private ulong diff { get; set; }
        private ulong rltp { get; set; }
        private int[] pbits { get; set; } = new int[5];
        private double[] cdf { get; set; } = new double[64];
        private double[] logfact { get; set; } = new double[1024];

        public Binomialdev(int nn, double ppp, ulong i) : base(i)
        {
            this.pp = ppp;
            this.n = nn;
            pb = p = (pp <= 0.5 ? pp : 1.0 - pp);
            if (n <= 64)
            {
                uz = 0;
                uo = 0xffffffffffffffffL;
                rltp = 0;
                for (int j = 0; j < 5; j++)
                {
                    pbits[j] = 1 & ((int)(pb *= 2.0));
                }
                pb -= Math.Floor(pb);
                swch = 0;
            }
            else if (n * p < 30.0)
            {
                cdf[0] = Math.Exp(n * Math.Log(1 - p));
                for (int j = 1; j < 64; j++)
                {
                    cdf[j] = cdf[j - 1] + Math.Exp(Globals.gammln(n + 1.0) - Globals.gammln(j + 1.0) - Globals.gammln(n - j + 1.0) + j * Math.Log(p) + (n - j) * Math.Log(1.0 - p));
                }
                swch = 1;
            }
            else
            {
                np = n * p;
                glnp = Globals.gammln(n + 1.0);
                plog = Math.Log(p);
                pclog = Math.Log(1.0 - p);
                sq = Math.Sqrt(np * (1.0 - p));
                if (n < 1024)
                {
                    for (int j = 0; j <= n; j++)
                    {
                        logfact[j] = Globals.gammln(j + 1.0);
                    }
                }
                swch = 2;
            }
        }

        public int dev()
        {
            int k;
            if (swch == 0)
            {
                unfin = uo;
                for (int j = 0; j < 5; j++)
                {
                    diff = unfin & (int64() ^ (pbits[j] > 0 ? uo : uz));
                    if (pbits[j] > 0)
                    {
                        rltp |= diff;
                    }
                    else
                    {
                        rltp = rltp & ~diff;
                    }
                    unfin = unfin & ~diff;
                }
                k = 0;
                for (int j = 0; j < n; j++)
                {
                    if ((unfin & 1) > 0)
                    {
                        if (doub() < pb)
                        {
                            ++k;
                        }
                    }
                    else
                    {
                        if ((rltp & 1) > 0)
                        {
                            ++k;
                        }
                    }
                    unfin >>= 1;
                    rltp >>= 1;
                }
            }
            else if (swch == 1)
            {
                double y = doub();
                int kl = -1;
                k = 64;
                while (k - kl > 1)
                {
                    int km = (kl + k) / 2;
                    if (y < cdf[km])
                    {
                        k = km;
                    }
                    else
                    {
                        kl = km;
                    }
                }
            }
            else
            {
                for (; ; )
                {
                    double u = 0.645 * doub();
                    double v = -0.63 + 1.25 * doub();
                    double v2 = Globals.SQR(v);
                    if (v >= 0.0)
                    {
                        if (v2 > 6.5 * u * (0.645 - u) * (u + 0.2))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        if (v2 > 8.4 * u * (0.645 - u) * (u + 0.1))
                        {
                            continue;
                        }
                    }
                    k = (int)(Math.Floor(sq * (v / u) + np + 0.5));
                    if (k < 0 || k > n)
                    {
                        continue;
                    }
                    double u2 = Globals.SQR(u);
                    if (v >= 0.0)
                    {
                        if (v2 < 12.25 * u2 * (0.615 - u) * (0.92 - u))
                        {
                            break;
                        }
                    }
                    else
                    {
                        if (v2 < 7.84 * u2 * (0.615 - u) * (1.2 - u))
                        {
                            break;
                        }
                    }
                    double b = sq * Math.Exp(glnp + k * plog + (n - k) * pclog - (n < 1024 ? logfact[k] + logfact[n - k] : Globals.gammln(k + 1.0) + Globals.gammln(n - k + 1.0)));
                    if (u2 < b)
                    {
                        break;
                    }
                }
            }
            if (p != pp)
            {
                k = n - k;
            }
            return k;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/995063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day57 补

647. 回文子串 力扣题目链接(opens new window) 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 示例 1&#xff1a; 输入&#xff1a…

机器学习——boosting之提升树

提升树和adaboost基本流程是相似的 我看到提升树的时候&#xff0c;懵了 这…跟adaboost有啥区别&#xff1f;&#xff1f;&#xff1f; 直到看到有个up主说了&#xff0c;我才稍微懂 相当于&#xff0c;我在adaboost里的弱分类器&#xff0c;换成CART决策树就好了呗&#xff1…

Yolov8-pose关键点检测:模型轻量化创新 | ​BiLevelRoutingAttention 动态稀疏注意力 | CVPR2023 BiFormer

💡💡💡本文解决什么问题:BiLevelRoutingAttention ,通过双层路由(bi-level routing)提出了一种新颖的动态稀疏注意力(dynamic sparse attention ) ​BiLevelRoutingAttention | GFLOPs从9.6降低至8.5,参数量从6482kb降低至6134kb, mAP50从0.921提升至0.926 Yolov8…

云备份服务端——实用类工具实现

一&#xff0c;文件实用类设计实现 不管是客户端还是服务端&#xff0c;文件的传输备份都涉及到文件的读写&#xff0c;包括数据管理信息的持久化也是如此&#xff0c;因此首先设计封装文件操作类&#xff0c;这个类封装完毕之后&#xff0c;则在任意模块中对文件进行操作时都将…

SLAM ORB-SLAM2(1)总体框架

SLAM ORB-SLAM2(1)总体框架 1. 简介2. 框架3. TRACKING4. LOCAL MAPPING5. LOOP CLOSING6. MAP1. 简介 ORB-SLAM2 是一个实时和完整的视觉SLAM系统(包括闭环检测、重定位、地图重用等功能) 提供了利用单目、双目以及RGB-D相机完成稀疏三维重建的功能和接口 2. 框架 总体来说…

c++day3

1> 自行封装一个栈的类&#xff0c;包含私有成员属性&#xff1a;栈的数组、记录栈顶的变量 成员函数完成&#xff1a;构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 #include <iostream>using namespace std; clas…

baichuan2(百川2)本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Vue3,Typescript中引用组件路径无法找到模块报错

是这么个事&#xff0c;我在vue3新创建的项目里&#xff0c;写了个组件叫headerIndex.vue&#xff0c;放到app.vue中import就会报错 路径肯定没写错&#xff0c;找到了解决方法&#xff0c;但是也没想明白为什么 解决方法如下 在vite-env.d.ts文件中加入 declare module &qu…

《向量数据库》——向量数据库Milvus 和大模型出联名款AI原生Milvus Cloud

大模型技术的发展正加速对千行百业的改革和重塑,向量数据库作为大模型的海量记忆体、云计算作为大模型的大算力平台,是大模型走向行业的基石。而电商行业因其高度的数字化程度,成为打磨大模型的绝佳“战场”。 在此背景下,Zilliz 联合亚马逊云科技举办的【向量数据库 X 云计…

Java类和对象(七千字详解!!!带你彻底理解类和对象)

目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象和面向过程 &#xff08;1&#xff09;传统洗衣服的过程 &#xff08;2&#xff09;现代洗衣服过程 ​编辑 二、类的定义和使用 1、类的定义格式 三、类的实例化 1、什么是实例化 2、类和对象说明 四、t…

【2023年11月第四版教材】第11章《成本管理》(合集篇)

第11章《成本管理》&#xff08;合集篇&#xff09; 1 章节说明2 管理基础3 管理过程3.1 管理ITTO汇总★★★ 4 规划成本管理4.1 成本管理计划★★★ 5 估算成本5.1 估算成本★★★ &#xff08;19上57&#xff09; &#xff08;19下35&#xff09;5.2 数据分析★★★5.4 成本估…

阿里云免费镜像仓库+金克斯+码云实现自动CI

前提 有阿里云账号&#xff0c;并且已经完成实名认证。最好有一台云服务器&#xff0c;以及码云账号&#xff0c;还有现成的项目以及Dockerfile一、开通阿里云容器镜像服务 1、新建命名空间(一般只需要建一个就行了) 2、在命名空间下&#xff0c;建立镜像仓库&#xff0c;看下…

D. Choosing Capital for Treeland

Problem - 219D - Codeforces 问题描述&#xff1a;Treeland国有 n 个城市, 这 n 个城市连接成了一棵树, 靠单向道路相连, 现在政府想要选择一个城市作为首都, 条件是首都必须能到达其他所有城市, 现在我们不得不将一些道路反转方向, 记反转的条数为 k 条, 我们要找到所有使 k…

c++day2---9.7

1> 思维导图 2> 封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员…

VMware的三种连接模式

目录 目录 前言 系列文章列表 思维导图 1&#xff0c;VMware是什么? 2&#xff0c;VMware的连接模式 2.1,VMware的连接模式是什么? 2.2, VMware的连接模式的分类 3&#xff0c;桥接模式 3.1,图示介绍 3.2,详细介绍 3.3,注意点 4.NAT模式 4.1,NAT协议 4.2,图示…

安科瑞精密配电多回路监控装置在轨道交通项目上的应用

安科瑞 崔丽洁 一、行业背景 轨道交通作为城市公共交通系统的一部分&#xff0c;在过去几十年中得到了广泛的发展和扩张。它在解决城市交通拥堵、减少环境污染、提高城市可持续性等方面发挥了重要作用。随着科技的进步&#xff0c;轨道交通系统也在不断引入新的技术和创新&…

桉木板材的优缺点

桉木&#xff08;Eucalyptus&#xff09;是一种常见的木材品种&#xff0c;具有一些独特的特点和用途。以下是桉木板材的一些优点和缺点&#xff1a; 优点&#xff1a;强度高&#xff1a;桉木具有较高的密度和强度&#xff0c;使其在承重和结构应用中表现出色。它的强度比一些其…

HashMap核心方法:put()、putVal()、resize()与treeifyBin()

一、put方法 put方法的源码如下&#xff1a; 由此可见put的核心方法为putVal() putVal方法各参数值讲解&#xff1a; 前面三个参数不做过多讲解&#xff0c;第4个参数是控制是否要覆盖原来key中已经存在的值&#xff0c;比如HashMap的putIfAbsent方法调的也是putVal方法&…

Reinforcement Learning for Solving the Vehicle Routing Problem

Reinforcement Learning for Solving the Vehicle Routing Problem 一、背景二、模型三、公式 一、背景 本篇论文讨论一种有容量限制的版本CVRP&#xff0c;一辆有有限容量的车辆负责向地理分布的、需求有限的客户交付物品&#xff1b;当车辆的负载耗尽&#xff0c;它返回仓库…

MyBatis中一对一、一对多和多对多关联关系的配置详解

MyBatis中一对一、一对多和多对多关联关系的配置详解 引言一对一关联关系配置一对多关联关系配置结论 多对多关联关系配置结论 引言 MyBatis是一款优秀的持久层框架&#xff0c;它提供了灵活且强大的关联关系配置功能。本文将介绍MyBatis中一对一、一对多和多对多关联关系的配置…