K. Upside down primes(Miller_Rabin求大素数)

本文介绍了一个特殊的素数判断问题,即一个数及其180°旋转后的数都必须是素数。文中详细解释了数字旋转的规则,并使用了Miller-Rabin素性测试算法来验证素性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:https://nanti.jisuanke.com/t/28400

题意:将一个数旋转180°,这个数要是个素数,而且旋转后的数也要是个素数。


180°旋转效果:
这里写图片描述


0、1、2、5、8这几个数旋转后还是他们本身。
而6旋转会变成9,9旋转后会变成6。
3、4、7这三个数旋转后将不是有效数字。

这里写图片描述

这里不知道为什么,用atoi(str.c_str())reverse()都不可以。。而且求素数也要用Miller_Rabin(米勒拉宾)。
米勒拉宾求大素数可以看这篇博客


#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long ll;

ll mult_mod(ll a,ll b,ll Mod) {     //快乘法,防止快速幂溢出
    ll ans = 0;
    while(b) {
        if(b&1)
            ans = (ans+a)%Mod;
        a = a*2%Mod;
        b >>= 1;
    }
    return ans;
}

ll pow_mod(ll a,ll b,ll Mod) {      //快速幂
    ll ans = 1, base = a;
    while(b) {
        if(b&1)
            ans = mult_mod(ans,base,Mod);
        base = mult_mod(base,base,Mod);
        b >>= 1;
    }
    return ans;
}

bool Miller_Rabin(ll n,ll a) {    //米勒拉宾素数测试
    ll d = n-1, s = 0;
    while(!(d&1)) {     //求(2^s)*d中的s和d.
        d >>= 1;
        s ++;
    }
    ll k = pow_mod(a,d,n);

    if(k == 1 )
        return true;

    for(int j=0; j<s; j++) {
        if(k == n-1)
            return true;
        k = mult_mod(k,k,n);    //快乘
    }
    return false;
}

bool IsPrime(ll n) {
    ll a[4] = {3,4,7,11};
    for(int i=0; i<4; i++) {
        if(n == a[i])
            return true;
        if(!n%a[i])
            return false;
        if(n>a[i] && !Miller_Rabin(n,a[i]))
            return false;
    }
    return true;
}

bool check(ll n) {
    if(n==2)
        return true;
    else if(n<2 || !n%2)
        return false;
    else if(IsPrime(n))
        return true;
    return false;
}

int main() {
    srand(time(NULL));
    ll num1,num2,bit;
    string str;
    cin>>str;
    ll len = str.length();

    num1 = 0;
    bit = 1;
    for(ll i=len-1; i>=0; i--) {
        num1 += (str[i]-'0') * bit;
        bit *= 10;
    }

    if(!check(num1)) {      //判断未翻转前是否是素数
        printf("no\n");
        return 0;
    }

    num2 = 0;
    bit = 1;
    for(ll i=0; i<len; i++) {       //翻转
        if(str[i] == '3' || str[i] == '4' || str[i] == '7') {       //不存在
            printf("no\n");
            return 0;
        }
        if(str[i] == '6') {
            str[i] = '9';
        } else if(str[i] == '9') {
            str[i] = '6';
        }
        num2 += (str[i]-'0') * bit;
        bit *= 10;
    }

    if(!check(num2)) {
        printf("no\n");
        return 0;
    }

    printf("yes\n");

    return 0;
}
import time import pickle import numpy as np from mini_bdx_runtime.rustypot_position_hwi import HWI from mini_bdx_runtime.onnx_infer import OnnxInfer from mini_bdx_runtime.raw_imu import Imu from mini_bdx_runtime.poly_reference_motion import PolyReferenceMotion from mini_bdx_runtime.xbox_controller import XBoxController from mini_bdx_runtime.feet_contacts import FeetContacts from mini_bdx_runtime.eyes import Eyes from mini_bdx_runtime.sounds import Sounds from mini_bdx_runtime.antennas import Antennas from mini_bdx_runtime.projector import Projector from mini_bdx_runtime.rl_utils import make_action_dict, LowPassActionFilter from mini_bdx_runtime.duck_config import DuckConfig import os HOME_DIR = os.path.expanduser("~") class RLWalk: def __init__( self, onnx_model_path: str, duck_config_path: str = f"{HOME_DIR}/duck_config.json", serial_port: str = "/dev/ttyACM0", control_freq: float = 50, pid=[30, 0, 0], action_scale=0.25, commands=False, pitch_bias=0, save_obs=False, replay_obs=None, cutoff_frequency=None, ): self.duck_config = DuckConfig(config_json_path=duck_config_path) self.commands = commands self.pitch_bias = pitch_bias self.onnx_model_path = onnx_model_path self.policy = OnnxInfer(self.onnx_model_path, awd=True) self.num_dofs = 14 self.max_motor_velocity = 5.24 # rad/s # Control self.control_freq = control_freq self.pid = pid self.save_obs = save_obs if self.save_obs: self.saved_obs = [] self.replay_obs = replay_obs if self.replay_obs is not None: self.replay_obs = pickle.load(open(self.replay_obs, "rb")) self.action_filter = None if cutoff_frequency is not None: self.action_filter = LowPassActionFilter( self.control_freq, cutoff_frequency ) self.hwi = HWI(self.duck_config, serial_port) self.start() self.imu = Imu( sampling_freq=int(self.control_freq), user_pitch_bias=self.pitch_bias, upside_down=self.duck_config.imu_upside_down, ) self.feet_contacts = FeetContacts() # Scales self.action_scale = action_scale self.last_action = np.zeros(self.num_dofs) self.last_last_action = np.zeros(self.num_dofs) self.last_last_last_action = np.zeros(self.num_dofs) self.init_pos = list(self.hwi.init_pos.values()) self.motor_targets = np.array(self.init_pos.copy()) self.prev_motor_targets = np.array(self.init_pos.copy()) self.last_commands = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] self.paused = self.duck_config.start_paused self.command_freq = 20 # hz if self.commands: self.xbox_controller = XBoxController(self.command_freq) # Reference motion, but we only really need the length of one phase # TODO self.PRM = PolyReferenceMotion("./polynomial_coefficients.pkl") self.imitation_i = 0 self.imitation_phase = np.array([0, 0]) self.phase_frequency_factor = 1.0 self.phase_frequency_factor_offset = ( self.duck_config.phase_frequency_factor_offset ) # Optional expression features if self.duck_config.eyes: self.eyes = Eyes() if self.duck_config.projector: self.projector = Projector() if self.duck_config.speaker: self.sounds = Sounds( volume=1.0, sound_directory="../mini_bdx_runtime/assets/" ) if self.duck_config.antennas: self.antennas = Antennas() def get_obs(self): imu_data = self.imu.get_data() dof_pos = self.hwi.get_present_positions( ignore=[ "left_antenna", "right_antenna", ] ) # rad dof_vel = self.hwi.get_present_velocities( ignore=[ "left_antenna", "right_antenna", ] ) # rad/s if dof_pos is None or dof_vel is None: return None if len(dof_pos) != self.num_dofs: print(f"ERROR len(dof_pos) != {self.num_dofs}") return None if len(dof_vel) != self.num_dofs: print(f"ERROR len(dof_vel) != {self.num_dofs}") return None cmds = self.last_commands feet_contacts = self.feet_contacts.get() obs = np.concatenate( [ imu_data["gyro"], imu_data["accelero"], cmds, dof_pos - self.init_pos, dof_vel * 0.05, self.last_action, self.last_last_action, self.last_last_last_action, self.motor_targets, feet_contacts, self.imitation_phase, ] ) return obs def start(self): kps = [self.pid[0]] * 14 kds = [self.pid[2]] * 14 # lower head kps kps[5:9] = [8, 8, 8, 8] self.hwi.set_kps(kps) self.hwi.set_kds(kds) self.hwi.turn_on() time.sleep(2) def get_phase_frequency_factor(self, x_velocity): max_phase_frequency = 1.2 min_phase_frequency = 1.0 # Perform linear interpolation freq = min_phase_frequency + (abs(x_velocity) / 0.15) * ( max_phase_frequency - min_phase_frequency ) return freq def run(self): i = 0 try: print("Starting") start_t = time.time() while True: left_trigger = 0 right_trigger = 0 t = time.time() if self.commands: self.last_commands, self.buttons, left_trigger, right_trigger = ( self.xbox_controller.get_last_command() ) if self.buttons.dpad_up.triggered: self.phase_frequency_factor_offset += 0.05 print( f"Phase frequency factor offset {round(self.phase_frequency_factor_offset, 3)}" ) if self.buttons.dpad_down.triggered: self.phase_frequency_factor_offset -= 0.05 print( f"Phase frequency factor offset {round(self.phase_frequency_factor_offset, 3)}" ) if self.buttons.LB.is_pressed: self.phase_frequency_factor = 1.3 else: self.phase_frequency_factor = 1.0 if self.buttons.X.triggered: if self.duck_config.projector: self.projector.switch() if self.buttons.B.triggered: if self.duck_config.speaker: self.sounds.play_random_sound() if self.duck_config.antennas: self.antennas.set_position_left(right_trigger) self.antennas.set_position_right(left_trigger) if self.buttons.A.triggered: self.paused = not self.paused if self.paused: print("PAUSE") else: print("UNPAUSE") if self.paused: time.sleep(0.1) continue obs = self.get_obs() if obs is None: continue self.imitation_i += 1 * ( self.phase_frequency_factor + self.phase_frequency_factor_offset ) self.imitation_i = self.imitation_i % self.PRM.nb_steps_in_period self.imitation_phase = np.array( [ np.cos( self.imitation_i / self.PRM.nb_steps_in_period * 2 * np.pi ), np.sin( self.imitation_i / self.PRM.nb_steps_in_period * 2 * np.pi ), ] ) if self.save_obs: self.saved_obs.append(obs) if self.replay_obs is not None: if i < len(self.replay_obs): obs = self.replay_obs[i] else: print("BREAKING ") break action = self.policy.infer(obs) self.last_last_last_action = self.last_last_action.copy() self.last_last_action = self.last_action.copy() self.last_action = action.copy() # action = np.zeros(10) self.motor_targets = self.init_pos + action * self.action_scale # self.motor_targets = np.clip( # self.motor_targets, # self.prev_motor_targets # - self.max_motor_velocity * (1 / self.control_freq), # control dt # self.prev_motor_targets # + self.max_motor_velocity * (1 / self.control_freq), # control dt # ) if self.action_filter is not None: self.action_filter.push(self.motor_targets) filtered_motor_targets = self.action_filter.get_filtered_action() if ( time.time() - start_t > 1 ): # give time to the filter to stabilize self.motor_targets = filtered_motor_targets self.prev_motor_targets = self.motor_targets.copy() head_motor_targets = self.last_commands[3:] + self.motor_targets[5:9] self.motor_targets[5:9] = head_motor_targets action_dict = make_action_dict( self.motor_targets, list(self.hwi.joints.keys()) ) self.hwi.set_position_all(action_dict) i += 1 took = time.time() - t # print("Full loop took", took, "fps : ", np.around(1 / took, 2)) if (1 / self.control_freq - took) < 0: print( "Policy control budget exceeded by", np.around(took - 1 / self.control_freq, 3), ) time.sleep(max(0, 1 / self.control_freq - took)) except KeyboardInterrupt: if self.duck_config.antennas: self.antennas.stop() if self.save_obs: pickle.dump(self.saved_obs, open("robot_saved_obs.pkl", "wb")) print("TURNING OFF") if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument("--onnx_model_path", type=str, required=True) parser.add_argument( "--duck_config_path", type=str, required=False, default=f"{HOME_DIR}/duck_config.json", ) parser.add_argument("-a", "--action_scale", type=float, default=0.25) parser.add_argument("-p", type=int, default=30) parser.add_argument("-i", type=int, default=0) parser.add_argument("-d", type=int, default=0) parser.add_argument("-c", "--control_freq", type=int, default=50) parser.add_argument("--pitch_bias", type=float, default=0, help="deg") parser.add_argument( "--commands", action="store_true", default=True, help="external commands, keyboard or gamepad. Launch control_server.py on host computer", ) parser.add_argument( "--save_obs", type=str, required=False, default=False, help="save the run's observations", ) parser.add_argument( "--replay_obs", type=str, required=False, default=None, help="replay the observations from a previous run (can be from the robot or from mujoco)", ) parser.add_argument("--cutoff_frequency", type=float, default=None) args = parser.parse_args() pid = [args.p, args.i, args.d] print("Done parsing args") rl_walk = RLWalk( args.onnx_model_path, duck_config_path=args.duck_config_path, action_scale=args.action_scale, pid=pid, control_freq=args.control_freq, commands=args.commands, pitch_bias=args.pitch_bias, save_obs=args.save_obs, replay_obs=args.replay_obs, cutoff_frequency=args.cutoff_frequency, ) print("Done instantiating RLWalk") rl_walk.run() 这个程序为什么手柄按A有反应,按B X Y left right LB 都没反应?
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值