小编Dan*_*udy的帖子

一个大整数如何除以另一个大整数?

最近几天我一直在研究这个,但我一直无法找到答案。我想出了一种算法,如果除数只有一个词,它就可以工作。但是,如果除数是多个词,那么我会得到一些奇怪的答案。我知道这个问题在这里已经被问过几次了,但是除了使用教科书方法或去买一本关于这个主题的书外,没有明确的答案。除了除法之外,我已经能够让我的大整数库中的每个函数都可以工作。似乎有些人认为大整数除法是一个 NP 难题,并且由于我遇到的麻烦,我倾向于同意。

数据存储在一个结构中,该结构包含指向 uint16_t 或 uint32_t 数组的指针,具体取决于是否支持 long long 数据类型。如果不支持 long long,则 uint16_t 用于捕获乘法和加法运算中的任何进位/溢出。我目前拥有的函数是加法、减法、乘法、2 的补码否定、比较、和、或、异或、非、左移、右移、左旋转、右旋转、位反转(反射)、一些转换例程,随机数填充例程和其他一些实用例程。除除法外,所有这些都正常工作(我在计算器上检查了结果)。

typedef struct bn_data_t bn_t;
struct bn_data_t
  {
    uint32 sz1;         /* Bit Size */
    uint32 sz8;         /* Byte Size */
    uint32 szw;         /* Word Count */
    bnint *dat;         /* Data Array */
    uint32 flags;       /* Operational Flags */
  };
Run Code Online (Sandbox Code Playgroud)

这与我询问的关于内联汇编器的另一个问题有关,因为这就是它的用途。

到目前为止我发现了什么:

除法非常大的数字

疯狂大整数除法的最快算法是什么?

https://en.wikipedia.org/wiki/Division_algorithm

具有大整数的 Newton-Raphson 除法

还有一堆关于这个主题的学术论文。

到目前为止我尝试过的:

我有一个基本的例程工作,但它将多字大整数除以单个字。我曾尝试实现 Newton-Raphson 算法,但这不起作用,因为我得到了一些非常奇怪的结果。我从它所基于的微积分中知道牛顿的方法,但这是整数数学而不是浮点数。我了解 Goldschmidt 除法算法背后的数学原理,但我不清楚如何用整数数学来实现它。其中一些算法的部分问题在于它们需要以 2 为底的对数函数。我知道如何使用浮点数和泰勒级数实现对数函数,但在使用整数数学时不知道。

我曾尝试查看GMP库,但除法算法没有很好的文档记录,而且有点超出我的想象。似乎他们在不同的点使用不同的算法,这增加了混乱。

对于学术论文,我主要了解数学(我已经清除了基本微积分数学,多变量微积分和常微分方程),但再次,我的数学知识和使用整数数学实现之间存在脱节。我已经看到有人建议使用小学方法,据我所知,该方法类似于移位减法方法,但我也不太确定如何实施该方法。有任何想法吗?代码会很好。

编辑: …

c algorithm math biginteger division

7
推荐指数
1
解决办法
4810
查看次数

具有动态环境变量的 AWS CDK StateMachine BatchSubmitJob

我正在尝试在 AWS CDK 中创建一个带有 BatchSubmitJob 的状态机,并在 BatchContainerOverrides 中使用动态环境变量。我在想这样的事情:

container_overrides = sfn_tasks.BatchContainerOverrides(
    environment={
        "TEST.$": "$.dynamic_from_payload"
    }
)

return sfn_tasks.BatchSubmitJob(self.scope,
                                id="id",
                                job_name="name",
                                job_definition_arn="arn",
                                job_queue_arn="arn",
                                container_overrides=container_overrides,
                                payload=sfn.TaskInput.from_object({
                                    "dynamic_from_payload.$": "$.input.some_variable"
                                }))
Run Code Online (Sandbox Code Playgroud)

但是,在部署时,CDK 会将“名称”和“值”添加到状态机定义中,但值现在是静态的。这是状态机定义的一部分,如控制台中所示:

"Environment": [
    {
        "Name": "TEST.$",
        "Value": "$.dynamic_from_payload"
    }
]
Run Code Online (Sandbox Code Playgroud)

但我需要这样:

"Environment": [
    {
        "Name": "TEST",
        "Value.$": "$.dynamic_from_payload"
    }
]
Run Code Online (Sandbox Code Playgroud)

我还尝试使用“Ref::”,如此处对命令参数所做的那样:AWS Step 和 Batch Dynamic Command。但这也行不通。

我还研究了逃生舱口,覆盖了 CloudFormation 模板。但我认为这不适用于此处,因为生成的状态机定义字符串基本上是一个大字符串。

我可以想到两种解决方案,但这两种解决方案都不让我高兴:用转义舱口覆盖状态机定义字符串,并使用其中“值”在某些条件下被替换的副本(可能使用正则表达式)或将 lambda 放入状态机中这将创建并触发批处理作业以及一个将轮询作业是否完成的 lambda。

长话短说:有人知道如何在 CDK 中将动态环境变量与 BatchSubmitJob 一起使用吗?

aws-step-functions aws-batch aws-cdk

5
推荐指数
1
解决办法
918
查看次数

PHP 的名为互斥体的 SyncMutex 类是否可以在同一服务器上的不同进程之间工作?

背景

我正在使用 Apache 和 PHP 构建 Web 应用程序,并且需要同步对共享内存区域的访问。由于 PHP 的不同实例有不同的进程 ID,我想知道 PHP 的带有命名互斥体的 SyncMutex 类是否可以用于此目的。通过 Google 搜索,我看到了很多有关使用文件作为互斥体的信息,但关于 SyncMutex 类的信息并不多。除了类的定义和一些如何使用它的示例之外,甚至手册也没有提供更多信息。

问题

一个进程中名为 mutex 的 SyncMutex 类在另一个进程中是否可见?

研究

https://helperbyte.com/questions/470561/how-to-prevent-simultaneous-running-of-a-php-script

PHP 互斥(mutex)

PHP 重写包含的文件 - 这是一个有效的脚本吗?

在 PHP 中防止竞争条件的最可靠和安全的方法

最后

所涉及的数据非常瞬态,并且可能会立即发生变化(想想 C 中的 volatile 关键字)。数据在 30 秒左右后变得无用,并会定期清除。出于性能原因,我将其存储在服务器的共享内存中,访问速度比写入文件或数据库要快得多。这是一个有效的用例还是我找错了树?我应该使用其他东西吗?就像信号量一样?

其他信息(编辑 8/25/2021)

经过进一步研究,我发现 PHP 的 pthreads 模块几个月前就被模块所有者贬值了,并且不再维护。PHP 现在使用称为并行的东西来促进多线程。由于我正在使用的设置的设计,并行与我想要做的事情不兼容。所以看来我现在必须使用 MySQL 来处理这个问题。

我使用内存服务器的想法仍然可行,但是由于PHP多线程架构的变化,服务器需要用PHP以外的语言编写。这将使用 C++ 来完成,但不是现在。

感谢所有回复的人。

php mutex php-7

5
推荐指数
1
解决办法
735
查看次数

强制解锁由其他线程锁定的互斥锁

考虑以下测试程序:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <strings.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>


pthread_mutex_t mutex;
pthread_mutexattr_t mattr;
pthread_t thread1;
pthread_t thread2;
pthread_t thread3;


void mutex_force_unlock(pthread_mutex_t *mutex, pthread_mutexattr_t *mattr)
  {
    int e;
    e = pthread_mutex_destroy(mutex);
    printf("mfu: %s\n", strerror(e));
    e = pthread_mutex_init(mutex, mattr);
    printf("mfu: %s\n", strerror(e));
  }

void *thread(void *d)
  {
    int e;

    e = pthread_mutex_trylock(&mutex);
    if (e != 0)
      {
        printf("thr: %s\n", strerror(e));
        mutex_force_unlock(&mutex, &mattr);
        e = pthread_mutex_unlock(&mutex);
        printf("thr: %s\n", strerror(e));
        if (e != 0) pthread_exit(NULL);
        e …
Run Code Online (Sandbox Code Playgroud)

c multithreading freebsd pthreads

4
推荐指数
2
解决办法
2179
查看次数

将大整数转换为十进制字符串

冒着这个问题被投票重复,甚至被关闭的风险,我提出了这个问题。

背景

在“普通”数据类型(例如 int、long long 等)中,要将二进制数值转换为十进制字符串,您可以执行以下操作(以伪代码形式):

Set length = 0
Set divisor to largest base10 value the data type will hold (Divisor).
  Loop
    Divide number in question by divisor.
    Place result in a string at position length.
    Increment the length by 1.
    Divide the divisor by 10.
Reverse the string.
Print the string.
Run Code Online (Sandbox Code Playgroud)

(大多数)任何语言的实际实现都是相当简单的。

问题

我在使用上述方法时遇到的问题是,对于大整数(也称为任意精度算术),没有最大的基数 10 值可以开始。所以问题是“如果无法知道除数是多少,如何将除数初始化为最大可能的 base10 值?”

我尝试过的

仍在尝试起草解决方案。

研究

我在这里找到的一些链接包括以下内容:

将“大”十六进制数(字符串格式)转换为十进制数(字符串格式),无需 BigInteger 类

C:打印一个以 10 为基数的 BigInteger

将 BigInteger 转换为十进制(基数 10)字符串的最快方法?

将“大”十六进制数(字符串格式)转换为十进制数(字符串格式),无需 BigInteger 类 …

c biginteger format-conversion bigint

4
推荐指数
1
解决办法
3953
查看次数

如何从内联asm访问C结构/变量?

请考虑以下代码:

    int bn_div(bn_t *bn1, bn_t *bn2, bn_t *bnr)
  {
    uint32 q, m;        /* Division Result */
    uint32 i;           /* Loop Counter */
    uint32 j;           /* Loop Counter */

    /* Check Input */
    if (bn1 == NULL) return(EFAULT);
    if (bn1->dat == NULL) return(EFAULT);
    if (bn2 == NULL) return(EFAULT);
    if (bn2->dat == NULL) return(EFAULT);
    if (bnr == NULL) return(EFAULT);
    if (bnr->dat == NULL) return(EFAULT);


    #if defined(__i386__) || defined(__amd64__)
    __asm__ (".intel_syntax noprefix");
    __asm__ ("pushl %eax");
    __asm__ ("pushl %edx");
    __asm__ ("pushf");
    __asm__ ("movl %eax, …
Run Code Online (Sandbox Code Playgroud)

c x86 freebsd clang inline-assembly

2
推荐指数
1
解决办法
1813
查看次数

从指向结构中不同变量的指针访问结构的第一个变量

请考虑以下代码片段:

struct data_t {
    int data1;
    int data2;
    struct data_t *next;
    size_t size;
    int data3;
    int data4;
};

int *ptr;
struct data_t data;

...

ptr = &data.data4;
Run Code Online (Sandbox Code Playgroud)

现在使用指针,它被设置为指向结构中的最后一个元素,如何使用该指针访问结构中的第一个元素(data1)?

通常情况下,在这种情况下我要做的是用很多单词备份指针以指向该元素,但是存在问题.next结构中间的指针变量具有不同的大小,具体取决于平台.如果这是在32位平台上运行,那么指针是4字节,而在64位平台上,指针占用8个字节.size_t数据类型也会出现类似的问题.

虽然在示例中不清楚,但结构是内存块的标头,其大小可变并且是链接列表的一部分.AKA是内存分配器中的空闲列表.除了使用某种计算指针本身大小的初始化之外,是否有一种可移植的方法来获取结构的第一个元素的地址?

c struct pointers

2
推荐指数
1
解决办法
403
查看次数

arctan(x)函数给出了错误的答案

我正在使用Maclaurin系列用于arctan(x)而我得不到正确的答案.我正在用弧度进行计算.这是迄今为止的功能:

fp32 t32rArcTangent(fp32 number)
{
fp32 a, b, c, d;    /* Temp Variables */
fp32 t;             /* Number Temp */
uint32 i;           /* Loop Counter */

/* Time Savers */
if (b32fpcomp(number, MM_FP8INFINITY)) return((fp32)MM_PI / 2);
if (b32fpcomp(number, -MM_FP8INFINITY)) return(-(fp32)MM_PI / 2);

/* Setup */
a = 0;
b = 0;
c = 1;
d = number;
t = number * number;

/* Calculation Loop */
for (i = 0; i < MMPRVT_FP32_TRIG_LIMIT; i++)
  {
    b += d;
    if (b32fpcomp(a, …
Run Code Online (Sandbox Code Playgroud)

c algorithm math trigonometry

-1
推荐指数
1
解决办法
589
查看次数